# HG changeset patch # User Sebastien Decugis # Date 1557674140 -28800 # Node ID 73b9f2aefb75f066d891a03a9145cc7addb2f2d3 # Parent 229ecec59ff5620dc5e70a1570563a27c26c8b51# Parent 2adac053aac435d1548ab225eb2c229f5633cf33 Merged new extensions and improvements from Thomas, with approval from Effortel Technologies SA -- thank you. diff -r 229ecec59ff5 -r 73b9f2aefb75 INSTALL.pkgsrc --- a/INSTALL.pkgsrc Sun Jan 21 22:25:07 2018 +0800 +++ b/INSTALL.pkgsrc Sun May 12 23:15:40 2019 +0800 @@ -11,11 +11,7 @@ pkg_add bison pkg-config libidn gnutls libgcrypt mercurial and follow the usual installation note. -NetBSD does not support SCTP, so you have to add - -DDISABLE_SCTP:BOOL=ON -to the cmake command line. +For the optional extensions, you need mysql*-client, postgres*-client, +libxml2, jsoncpp, and json-schema. For the debugging extensions, +you also need swig and a python -- install as usual. -For the optional extensions, you need mysql*-client, postgres*-client, -libxml2. For the debugging extensions, you also need swig and a -python -- install as usual. - diff -r 229ecec59ff5 -r 73b9f2aefb75 LICENSE --- a/LICENSE Sun Jan 21 22:25:07 2018 +0800 +++ b/LICENSE Sun May 12 23:15:40 2019 +0800 @@ -2,7 +2,7 @@ Software License Agreement (BSD License) -Copyright (c) 2008-2018, WIDE Project and NICT +Copyright (c) 2008-2019, WIDE Project and NICT All rights reserved. Redistribution and use of this software in source and binary forms, with or without modification, are @@ -52,6 +52,3 @@ * Thomas Klausner: several extensions and numerous fixes / improvements. - - - diff -r 229ecec59ff5 -r 73b9f2aefb75 contrib/dict_json/dictionary_dcca.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/dict_json/dictionary_dcca.json Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,1208 @@ +{ + "AVPRules" : [ + { + "AVP" : "CC-Money", + "Content" : [ + { + "AVP" : "Currency-Code", + "Max" : 1 + }, + { + "AVP" : "Unit-Value", + "Max" : 1 + } + ] + }, + { + "AVP" : "Cost-Information", + "Content" : [ + { + "AVP" : "Cost-Unit", + "Max" : 1 + }, + { + "AVP" : "Currency-Code", + "Max" : 1 + }, + { + "AVP" : "Unit-Value", + "Max" : 1 + } + ] + }, + { + "AVP" : "Final-Unit-Indication", + "Content" : [ + { + "AVP" : "Filter-Id" + }, + { + "AVP" : "Redirect-Server", + "Max" : 1 + }, + { + "AVP" : "Restriction-Filter-Rule" + }, + { + "AVP" : "Final-Unit-Action", + "Max" : 1 + } + ] + }, + { + "AVP" : "Granted-Service-Unit", + "Content" : [ + { + "AVP" : "CC-Input-Octets", + "Max" : 1 + }, + { + "AVP" : "CC-Money", + "Max" : 1 + }, + { + "AVP" : "CC-Output-Octets", + "Max" : 1 + }, + { + "AVP" : "CC-Service-Specific-Units", + "Max" : 1 + }, + { + "AVP" : "CC-Time", + "Max" : 1 + }, + { + "AVP" : "CC-Total-Octets", + "Max" : 1 + }, + { + "AVP" : "Tariff-Time-Change", + "Max" : 1 + } + ] + }, + { + "AVP" : "Redirect-Server", + "Content" : [ + { + "AVP" : "Redirect-Address-Type", + "Max" : 1 + }, + { + "AVP" : "Redirect-Server-Address", + "Max" : 1 + } + ] + }, + { + "AVP" : "Requested-Service-Unit", + "Content" : [ + { + "AVP" : "CC-Input-Octets", + "Max" : 1 + }, + { + "AVP" : "CC-Money", + "Max" : 1 + }, + { + "AVP" : "CC-Output-Octets", + "Max" : 1 + }, + { + "AVP" : "CC-Service-Specific-Units", + "Max" : 1 + }, + { + "AVP" : "CC-Time", + "Max" : 1 + }, + { + "AVP" : "CC-Total-Octets", + "Max" : 1 + } + ] + }, + { + "AVP" : "Service-Parameter-Info", + "Content" : [ + { + "AVP" : "Service-Parameter-Type", + "Max" : 1 + }, + { + "AVP" : "Service-Parameter-Value", + "Max" : 1 + } + ] + }, + { + "AVP" : "Subscription-Id", + "Content" : [ + { + "AVP" : "Subscription-Id-Data", + "Max" : 1 + }, + { + "AVP" : "Subscription-Id-Type", + "Max" : 1 + } + ] + }, + { + "AVP" : "Unit-Value", + "Content" : [ + { + "AVP" : "Exponent", + "Max" : 1 + }, + { + "AVP" : "Value-Digits", + "Max" : 1 + } + ] + }, + { + "AVP" : "Used-Service-Unit", + "Content" : [ + { + "AVP" : "CC-Input-Octets", + "Max" : 1 + }, + { + "AVP" : "CC-Money", + "Max" : 1 + }, + { + "AVP" : "CC-Output-Octets", + "Max" : 1 + }, + { + "AVP" : "CC-Service-Specific-Units", + "Max" : 1 + }, + { + "AVP" : "CC-Time", + "Max" : 1 + }, + { + "AVP" : "CC-Total-Octets", + "Max" : 1 + }, + { + "AVP" : "Tariff-Change-Usage", + "Max" : 1 + } + ] + }, + { + "AVP" : "Multiple-Services-Credit-Control", + "Content" : [ + { + "AVP" : "Result-Code", + "Max" : 1 + }, + { + "AVP" : "Final-Unit-Indication", + "Max" : 1 + }, + { + "AVP" : "Granted-Service-Unit", + "Max" : 1 + }, + { + "AVP" : "Rating-Group", + "Max" : 1 + }, + { + "AVP" : "Requested-Service-Unit", + "Max" : 1 + }, + { + "AVP" : "Service-Identifier" + }, + { + "AVP" : "Used-Service-Unit" + }, + { + "AVP" : "Validity-Time", + "Max" : 1 + }, + { + "AVP" : "Tariff-Change-Usage", + "Max" : 1 + }, + { + "AVP" : "G-S-U-Pool-Reference" + } + ] + }, + { + "AVP" : "G-S-U-Pool-Reference", + "Content" : [ + { + "AVP" : "Unit-Value", + "Max" : 1 + }, + { + "AVP" : "G-S-U-Pool-Identifier", + "Max" : 1 + }, + { + "AVP" : "CC-Unit-Type", + "Max" : 1 + } + ] + }, + { + "AVP" : "User-Equipment-Info", + "Content" : [ + { + "AVP" : "User-Equipment-Info-Type", + "Max" : 1 + }, + { + "AVP" : "User-Equipment-Info-Value", + "Max" : 1 + } + ] + } + ], + "AVPs" : [ + { + "Code" : 268, + "EnumValues" : [ + { + "Code" : 5030, + "Name" : "USER_UNKNOWN" + }, + { + "Code" : 5031, + "Name" : "RATING_FAILED" + }, + { + "Code" : 4012, + "Name" : "CREDIT_LIMIT_REACHED" + }, + { + "Code" : 4010, + "Name" : "END_USER_SERVICE_DENIED" + }, + { + "Code" : 4011, + "Name" : "CREDIT_CONTROL_NOT_APPLICABLE" + } + ], + "Name" : "Result-Code", + "Type" : "Unsigned32" + }, + { + "Code" : 411, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "CC-Correlation-Id", + "Type" : "OctetString" + }, + { + "Code" : 412, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "CC-Input-Octets", + "Type" : "Unsigned64" + }, + { + "Code" : 413, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "CC-Money", + "Type" : "Grouped" + }, + { + "Code" : 414, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "CC-Output-Octets", + "Type" : "Unsigned64" + }, + { + "Code" : 415, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "CC-Request-Number", + "Type" : "Unsigned32" + }, + { + "Code" : 416, + "EnumValues" : [ + { + "Code" : 4, + "Name" : "EVENT_REQUEST" + }, + { + "Code" : 2, + "Name" : "UPDATE_REQUEST" + }, + { + "Code" : 1, + "Name" : "INITIAL_REQUEST" + }, + { + "Code" : 3, + "Name" : "TERMINATION_REQUEST" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "CC-Request-Type", + "Type" : "Enumerated" + }, + { + "Code" : 417, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "CC-Service-Specific-Units", + "Type" : "Unsigned64" + }, + { + "Code" : 418, + "EnumValues" : [ + { + "Code" : 1, + "Name" : "FAILOVER_SUPPORTED" + }, + { + "Code" : 0, + "Name" : "FAILOVER_NOT_SUPPORTED" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "CC-Session-Failover", + "Type" : "Enumerated" + }, + { + "Code" : 419, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "CC-Sub-Session-Id", + "Type" : "Unsigned64" + }, + { + "Code" : 420, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "CC-Time", + "Type" : "Unsigned32" + }, + { + "Code" : 421, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "CC-Total-Octets", + "Type" : "Unsigned64" + }, + { + "Code" : 422, + "EnumValues" : [ + { + "Code" : 1, + "Name" : "NO_CREDIT" + }, + { + "Code" : 0, + "Name" : "ENOUGH_CREDIT" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Check-Balance-Result", + "Type" : "Enumerated" + }, + { + "Code" : 423, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Cost-Information", + "Type" : "Grouped" + }, + { + "Code" : 424, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Cost-Unit", + "Type" : "UTF8String" + }, + { + "Code" : 425, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Currency-Code", + "Type" : "Unsigned32" + }, + { + "Code" : 426, + "EnumValues" : [ + { + "Code" : 1, + "Name" : "RE_AUTHORIZATION" + }, + { + "Code" : 0, + "Name" : "CREDIT_AUTHORIZATION" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Credit-Control", + "Type" : "Enumerated" + }, + { + "Code" : 427, + "EnumValues" : [ + { + "Code" : 1, + "Name" : "CONTINUE" + }, + { + "Code" : 0, + "Name" : "TERMINATE" + }, + { + "Code" : 2, + "Name" : "RETRY_AND_TERMINATE" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Credit-Control-Failure-Handling", + "Type" : "Enumerated" + }, + { + "Code" : 428, + "EnumValues" : [ + { + "Code" : 1, + "Name" : "CONTINUE" + }, + { + "Code" : 0, + "Name" : "TERMINATE_OR_BUFFER" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Direct-Debiting-Failure-Handling", + "Type" : "Enumerated" + }, + { + "Code" : 429, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Exponent", + "Type" : "Integer32" + }, + { + "Code" : 430, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Final-Unit-Indication", + "Type" : "Grouped" + }, + { + "Code" : 431, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Granted-Service-Unit", + "Type" : "Grouped" + }, + { + "Code" : 432, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Rating-Group", + "Type" : "Unsigned32" + }, + { + "Code" : 433, + "EnumValues" : [ + { + "Code" : 2, + "Name" : "URL" + }, + { + "Code" : 3, + "Name" : "SIP_URI" + }, + { + "Code" : 0, + "Name" : "IPV4_ADDRESS" + }, + { + "Code" : 1, + "Name" : "IPV6_ADDRESS" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Redirect-Address-Type", + "Type" : "Enumerated" + }, + { + "Code" : 434, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Redirect-Server", + "Type" : "Grouped" + }, + { + "Code" : 435, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Redirect-Server-Address", + "Type" : "UTF8String" + }, + { + "Code" : 436, + "EnumValues" : [ + { + "Code" : 2, + "Name" : "CHECK_BALANCE" + }, + { + "Code" : 3, + "Name" : "PRICE_ENQUIRY" + }, + { + "Code" : 1, + "Name" : "REFUND_ACCOUNT" + }, + { + "Code" : 0, + "Name" : "DIRECT_DEBITING" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Requested-Action", + "Type" : "Enumerated" + }, + { + "Code" : 437, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Requested-Service-Unit", + "Type" : "Grouped" + }, + { + "Code" : 438, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Restriction-Filter-Rule", + "Type" : "IPFilterRule" + }, + { + "Code" : 439, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Service-Identifier", + "Type" : "Unsigned32" + }, + { + "Code" : 440, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Service-Parameter-Info", + "Type" : "Grouped" + }, + { + "Code" : 441, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Service-Parameter-Type", + "Type" : "Unsigned32" + }, + { + "Code" : 442, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Service-Parameter-Value", + "Type" : "OctetString" + }, + { + "Code" : 443, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Subscription-Id", + "Type" : "Grouped" + }, + { + "Code" : 444, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Subscription-Id-Data", + "Type" : "UTF8String" + }, + { + "Code" : 445, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Unit-Value", + "Type" : "Grouped" + }, + { + "Code" : 446, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Used-Service-Unit", + "Type" : "Grouped" + }, + { + "Code" : 447, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Value-Digits", + "Type" : "Integer64" + }, + { + "Code" : 448, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Validity-Time", + "Type" : "Unsigned32" + }, + { + "Code" : 449, + "EnumValues" : [ + { + "Code" : 1, + "Name" : "REDIRECT" + }, + { + "Code" : 0, + "Name" : "TERMINATE" + }, + { + "Code" : 2, + "Name" : "RESTRICT_ACCESS" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Final-Unit-Action", + "Type" : "Enumerated" + }, + { + "Code" : 450, + "EnumValues" : [ + { + "Code" : 3, + "Name" : "END_USER_NAI" + }, + { + "Code" : 0, + "Name" : "END_USER_E164" + }, + { + "Code" : 1, + "Name" : "END_USER_IMSI" + }, + { + "Code" : 2, + "Name" : "END_USER_SIP_URI" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Subscription-Id-Type", + "Type" : "Enumerated" + }, + { + "Code" : 451, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Tariff-Time-Change", + "Type" : "Time" + }, + { + "Code" : 452, + "EnumValues" : [ + { + "Code" : 2, + "Name" : "UNIT_INDETERMINATE" + }, + { + "Code" : 1, + "Name" : "UNIT_AFTER_TARIFF_CHANGE" + }, + { + "Code" : 0, + "Name" : "UNIT_BEFORE_TARIFF_CHANGE" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Tariff-Change-Usage", + "Type" : "Enumerated" + }, + { + "Code" : 453, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "G-S-U-Pool-Identifier", + "Type" : "Unsigned32" + }, + { + "Code" : 454, + "EnumValues" : [ + { + "Code" : 0, + "Name" : "TIME" + }, + { + "Code" : 1, + "Name" : "MONEY" + }, + { + "Code" : 3, + "Name" : "INPUT-OCTETS" + }, + { + "Code" : 2, + "Name" : "TOTAL-OCTETS" + }, + { + "Code" : 4, + "Name" : "OUTPUT-OCTETS" + }, + { + "Code" : 5, + "Name" : "SERVICE-SPECIFIC-UNITS" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "CC-Unit-Type", + "Type" : "Enumerated" + }, + { + "Code" : 455, + "EnumValues" : [ + { + "Code" : 1, + "Name" : "MULTIPLE_SERVICES_SUPPORTED" + }, + { + "Code" : 0, + "Name" : "MULTIPLE_SERVICES_NOT_SUPPORTED" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Multiple-Services-Indicator", + "Type" : "Enumerated" + }, + { + "Code" : 456, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Multiple-Services-Credit-Control", + "Type" : "Grouped" + }, + { + "Code" : 457, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "G-S-U-Pool-Reference", + "Type" : "Grouped" + }, + { + "Code" : 458, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "User-Equipment-Info", + "Type" : "Grouped" + }, + { + "Code" : 459, + "EnumValues" : [ + { + "Code" : 1, + "Name" : "MAC" + }, + { + "Code" : 2, + "Name" : "EUI64" + }, + { + "Code" : 0, + "Name" : "IMEISV" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "User-Equipment-Info-Type", + "Type" : "Enumerated" + }, + { + "Code" : 460, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "User-Equipment-Info-Value", + "Type" : "OctetString" + }, + { + "Code" : 461, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Service-Context-Id", + "Type" : "UTF8String" + } + ], + "Applications" : [ + { + "Code" : 4, + "Name" : "Diameter Credit Control Application" + } + ], + "CommandRules" : [ + { + "Command" : "Credit-Control-Request", + "Content" : [ + { + "AVP" : "User-Name", + "Max" : 1 + }, + { + "AVP" : "Acct-Multi-Session-Id", + "Max" : 1 + }, + { + "AVP" : "Event-Timestamp", + "Max" : 1 + }, + { + "AVP" : "Auth-Application-Id", + "Max" : 1 + }, + { + "AVP" : "Session-Id", + "First" : true, + "Max" : 1 + }, + { + "AVP" : "Origin-Host", + "Max" : 1 + }, + { + "AVP" : "Origin-State-Id", + "Max" : 1 + }, + { + "AVP" : "Route-Record" + }, + { + "AVP" : "Destination-Realm", + "Max" : 1 + }, + { + "AVP" : "Proxy-Info" + }, + { + "AVP" : "Destination-Host", + "Max" : 1 + }, + { + "AVP" : "Termination-Cause", + "Max" : 1 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1 + }, + { + "AVP" : "CC-Correlation-Id", + "Max" : 1 + }, + { + "AVP" : "CC-Request-Number", + "Max" : 1 + }, + { + "AVP" : "CC-Request-Type", + "Max" : 1 + }, + { + "AVP" : "CC-Sub-Session-Id", + "Max" : 1 + }, + { + "AVP" : "Requested-Action", + "Max" : 1 + }, + { + "AVP" : "Requested-Service-Unit", + "Max" : 1 + }, + { + "AVP" : "Service-Identifier", + "Max" : 1 + }, + { + "AVP" : "Service-Parameter-Info" + }, + { + "AVP" : "Subscription-Id" + }, + { + "AVP" : "Used-Service-Unit" + }, + { + "AVP" : "Multiple-Services-Indicator", + "Max" : 1 + }, + { + "AVP" : "Multiple-Services-Credit-Control" + }, + { + "AVP" : "User-Equipment-Info", + "Max" : 1 + }, + { + "AVP" : "Service-Context-Id", + "Max" : 1 + } + ] + }, + { + "Command" : "Credit-Control-Answer", + "Content" : [ + { + "AVP" : "User-Name", + "Max" : 1 + }, + { + "AVP" : "Acct-Multi-Session-Id", + "Max" : 1 + }, + { + "AVP" : "Event-Timestamp", + "Max" : 1 + }, + { + "AVP" : "Auth-Application-Id", + "Max" : 1 + }, + { + "AVP" : "Redirect-Host-Usage", + "Max" : 1 + }, + { + "AVP" : "Redirect-Max-Cache-Time", + "Max" : 1 + }, + { + "AVP" : "Session-Id", + "First" : true, + "Max" : 1 + }, + { + "AVP" : "Origin-Host", + "Max" : 1 + }, + { + "AVP" : "Result-Code", + "Max" : 1 + }, + { + "AVP" : "Origin-State-Id", + "Max" : 1 + }, + { + "AVP" : "Failed-AVP" + }, + { + "AVP" : "Route-Record" + }, + { + "AVP" : "Proxy-Info" + }, + { + "AVP" : "Redirect-Host" + }, + { + "AVP" : "Origin-Realm", + "Max" : 1 + }, + { + "AVP" : "CC-Request-Number", + "Max" : 1 + }, + { + "AVP" : "CC-Request-Type", + "Max" : 1 + }, + { + "AVP" : "CC-Session-Failover", + "Max" : 1 + }, + { + "AVP" : "CC-Sub-Session-Id", + "Max" : 1 + }, + { + "AVP" : "Check-Balance-Result", + "Max" : 1 + }, + { + "AVP" : "Cost-Information", + "Max" : 1 + }, + { + "AVP" : "Credit-Control-Failure-Handling", + "Max" : 1 + }, + { + "AVP" : "Direct-Debiting-Failure-Handling", + "Max" : 1 + }, + { + "AVP" : "Final-Unit-Indication", + "Max" : 1 + }, + { + "AVP" : "Granted-Service-Unit", + "Max" : 1 + }, + { + "AVP" : "Validity-Time", + "Max" : 1 + }, + { + "AVP" : "Multiple-Services-Credit-Control" + } + ] + } + ], + "Commands" : [ + { + "Code" : 272, + "Flags" : { + "Must" : "RP", + "MustNot" : "" + }, + "Name" : "Credit-Control-Request" + }, + { + "Code" : 272, + "Flags" : { + "Must" : "P", + "MustNot" : "RE" + }, + "Name" : "Credit-Control-Answer" + } + ] +} + diff -r 229ecec59ff5 -r 73b9f2aefb75 contrib/dict_json/dictionary_dcca_3gpp.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/dict_json/dictionary_dcca_3gpp.json Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,12867 @@ +{ + "AVPRules": [ + { + "AVP": "ISUP-Cause", + "Content": [ + { + "AVP": "ISUP-Cause-Location", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "ISUP-Cause-Value", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "ISUP-Cause-Diagnostics", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Multiple-Services-Credit-Control", + "Content": [ + { + "AVP": "Granted-Service-Unit", + "Max": 1 + }, + { + "AVP": "Requested-Service-Unit", + "Max": 1 + }, + { + "AVP": "Used-Service-Unit", + }, + { + "AVP": "Tariff-Change-Usage", + "Max": 1 + }, + { + "AVP": "Service-Identifier", + }, + { + "AVP": "Rating-Group", + "Max": 1 + }, + { + "AVP": "G-S-U-Pool-Reference", + }, + { + "AVP": "Validity-Time", + "Max": 1 + }, + { + "AVP": "Result-Code", + "Max": 1 + }, + { + "AVP": "Final-Unit-Indication", + "Max": 1 + }, + { + "AVP": "Time-Quota-Threshold", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Volume-Quota-Threshold", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Unit-Quota-Threshold", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Quota-Holding-Time", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Quota-Consumption-Time", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Reporting-Reason", + "Vendor": 10415 + }, + { + "AVP": "Trigger", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "PS-Furnish-Charging-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Refund-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "AF-Correlation-Information", + "Vendor": 10415 + }, + { + "AVP": "Envelope", + "Vendor": 10415 + }, + { + "AVP": "Envelope-Reporting", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Time-Quota-Mechanism", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Service-Specific-Info", + "Vendor": 10415 + }, + { + "AVP": "QoS-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Announcement-Information", + "Vendor": 10415 + }, + { + "AVP": "3GPP-RAT-Type", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Related-Trigger", + "Vendor": 10415, + "Max": 1 + } + ] + }, + { + "AVP": "Service-Specific-Info", + "Content": [ + { + "AVP": "Service-Specific-Data", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Service-Specific-Type", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Used-Service-Unit", + "Content": [ + { + "AVP": "Reporting-Reason", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Tariff-Change-Usage", + "Max": 1 + }, + { + "AVP": "CC-Time", + "Max": 1 + }, + { + "AVP": "CC-Money", + "Max": 1 + }, + { + "AVP": "CC-Total-Octets", + "Max": 1 + }, + { + "AVP": "CC-Input-Octets", + "Max": 1 + }, + { + "AVP": "CC-Output-Octets", + "Max": 1 + }, + { + "AVP": "CC-Service-Specific-Units", + "Max": 1 + }, + { + "AVP": "Event-Charging-TimeStamp", + "Vendor": 10415 + } + ] + }, + { + "AVP": "Event-Type", + "Content": [ + { + "AVP": "SIP-Method", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Event", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Expires", + "Max": 1, + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Time-Stamps", + "Content": [ + { + "AVP": "SIP-Request-Timestamp", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "SIP-Response-Timestamp", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "SIP-Request-Timestamp-Fraction", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "SIP-Response-Timestamp-Fraction", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "SDP-Media-Component", + "Content": [ + { + "AVP": "SDP-Media-Name", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "SDP-Media-Description", + "Vendor": 10415 + }, + { + "AVP": "Local-GW-Inserted-Indication", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "IP-Realm-Default-Indication", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Transcoder-Inserted-Indication", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Media-Initiator-Flag", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Media-Initiator-Party", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-Charging-Id", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Access-Network-Charging-Identifier-Value", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "SDP-Type", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Application-Server-Information", + "Content": [ + { + "AVP": "Application-Server", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Application-Provided-Called-Party-Address", + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "PS-Furnish-Charging-Information", + "Content": [ + { + "AVP": "3GPP-Charging-Id", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "PS-Free-Format-Data", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "PS-Append-Free-Format-Data", + "Max": 1, + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Service-Information", + "Content": [ + { + "AVP": "Subscription-Id" + }, + { + "AVP": "PS-Information", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "IMS-Information", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "MMS-Information", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "LCS-Information", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "PoC-Information", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "MBMS-Information", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "SMS-Information", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "MMTel-Information", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "AoC-Information", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "IM-Information", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "DCD-Information", + "Max": 1, + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "PS-Information", + "Content": [ + { + "AVP": "Called-Station-Id", + "Max": 1 + }, + { + "AVP": "User-Equipment-Info", + "Max": 1 + }, + { + "AVP": "3GPP2-BSID", + "Max": 1, + "Vendor": 5535 + }, + { + "AVP": "3GPP-Charging-Id", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "3GPP-PDP-Type", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "3GPP-IMSI-MCC-MNC", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "3GPP-GGSN-MCC-MNC", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "3GPP-NSAPI", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "3GPP-Session-Stop-Indicator", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "3GPP-Selection-Mode", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "3GPP-Charging-Characteristics", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "3GPP-SGSN-MCC-MNC", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "3GPP-RAT-Type", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "3GPP-User-Location-Info", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "3GPP-MS-TimeZone", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "CG-Address", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "GGSN-Address", + "Vendor": 10415 + }, + { + "AVP": "PS-Furnish-Charging-Information", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Charging-Rule-Base-Name", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "QoS-Information", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "PDP-Address", + "Vendor": 10415 + }, + { + "AVP": "SGSN-Address", + "Vendor": 10415 + }, + { + "AVP": "PDP-Context-Type", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Offline-Charging", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Terminal-Information", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "MME-Number-for-MT-SMS", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Change-Condition", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Diagnostics", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Service-Data-Container", + "Vendor": 10415 + }, + { + "AVP": "Start-Time", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Stop-Time", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Traffic-Data-Volumes", + "Vendor": 10415 + }, + { + "AVP": "Serving-Node-Type", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "PDN-Connection-Charging-ID", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Dynamic-Address-Flag", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Node-Id", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "SGW-Change", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Charging-Characteristics-Selection-Mode", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "SGW-Address", + "Vendor": 10415 + }, + { + "AVP": "Dynamic-Address-Flag-Extension", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "IMSI-Unauthenticated-Flag", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "User-CSG-Information", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "MME-Name", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "MME-Realm", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Low-Priority-Indicator", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "PDP-Address-Prefix-Length", + "Max": 1, + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "IMS-Information", + "Content": [ + { + "AVP": "Server-Capabilities", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Session-Priority", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Event-Type", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Role-Of-Node", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "User-Session-Id", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Calling-Party-Address", + "Vendor": 10415 + }, + { + "AVP": "Called-Party-Address", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Time-Stamps", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Inter-Operator-Identifier", + "Vendor": 10415 + }, + { + "AVP": "IMS-Charging-Identifier", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "SDP-Session-Description", + "Vendor": 10415 + }, + { + "AVP": "SDP-Media-Component", + "Vendor": 10415 + }, + { + "AVP": "Served-Party-IP-Address", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Application-Server-Information", + "Vendor": 10415 + }, + { + "AVP": "Trunk-Group-Id", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Bearer-Service", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Service-Id", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Associated-URI", + "Vendor": 10415 + }, + { + "AVP": "Cause-Code", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Node-Functionality", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Message-Body", + "Vendor": 10415 + }, + { + "AVP": "Service-Specific-Info", + "Vendor": 10415 + }, + { + "AVP": "Called-Asserted-Identity", + "Vendor": 10415 + }, + { + "AVP": "Requested-Party-Address", + "Vendor": 10415 + }, + { + "AVP": "Access-Network-Information", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Early-Media-Description", + "Vendor": 10415 + }, + { + "AVP": "Alternate-Charged-Party-Address", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "IMS-Communication-Service-Identifier", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Carrier-Select-Routing-Information", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Number-Portability-Routing-Information", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Online-Charging-Flag", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Real-Time-Tariff-Information", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Account-Expiration", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Outgoing-Session-Id", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Initial-IMS-Charging-Identifier", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "IMS-Emergency-Indicator", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "IMS-Application-Reference-Identifier", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Transit-IOI-List", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "NNI-Information", + "Vendor": 10415 + }, + { + "AVP": "From-Address", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Access-Transfer-Information", + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "MMS-Information", + "Content": [ + { + "AVP": "Originator-Address", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "VASP-ID", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "VAS-ID", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Recipient-Address", + "Vendor": 10415 + }, + { + "AVP": "Submission-Time", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "MM-Content-Type", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Priority", + "Vendor": 10415 + }, + { + "AVP": "Message-ID", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Message-Type", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Message-Size", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Message-Class", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Delivery-Report-Requested", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Adaptations", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Applic-ID", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Aux-Applic-Info", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Content-Class", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "DRM-Content", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Read-Reply-Report-Requested", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Reply-Applic-ID", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "MMBox-Storage-Requested", + "Max": 1, + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Originator-Address", + "Content": [ + { + "AVP": "Address-Data", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Address-Domain", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Address-Type", + "Max": 1, + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Address-Domain", + "Content": [ + { + "AVP": "3GPP-IMSI-MCC-MNC", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Domain-Name", + "Max": 1, + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "QoS-Information", + "Content": [ + { + "AVP": "Max-Requested-Bandwidth-DL", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Max-Requested-Bandwidth-UL", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Bearer-Identifier", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Guaranteed-Bitrate-DL", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Guaranteed-Bitrate-UL", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "QoS-Class-Identifier", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Allocation-Retention-Priority", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "APN-Aggregate-Max-Bitrate-DL", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "APN-Aggregate-Max-Bitrate-UL", + "Max": 1, + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Recipient-Address", + "Content": [ + { + "AVP": "Address-Data", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Address-Domain", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Address-Type", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Addressee-Type", + "Max": 1, + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Message-Class", + "Content": [ + { + "AVP": "Class-Identifier", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Token-Text", + "Max": 1, + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Envelope", + "Content": [ + { + "AVP": "CC-Input-Octets", + "Max": 1 + }, + { + "AVP": "CC-Output-Octets", + "Max": 1 + }, + { + "AVP": "CC-Service-Specific-Units", + "Max": 1 + }, + { + "AVP": "CC-Total-Octets", + "Max": 1 + }, + { + "AVP": "Envelope-End-Time", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Envelope-Start-Time", + "Max": 1, + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Time-Quota-Mechanism", + "Content": [ + { + "AVP": "Time-Quota-Type", + "Vendor": 10415, + "Min": 1, + "Max": 1 + }, + { + "AVP": "Base-Time-Interval", + "Vendor": 10415, + "Min": 1, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Offline-Charging", + "Content": [ + { + "AVP": "Multiple-Services-Credit-Control" + }, + { + "AVP": "Quota-Consumption-Time", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Envelope-Reporting", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Time-Quota-Mechanism", + "Max": 1, + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "SMS-Information", + "Content": [ + { + "AVP": "Data-Coding-Scheme", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "SM-Message-Type", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Originator-SCCP-Address", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Originator-Interface", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Reply-Path-Requested", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "SM-Discharge-Time", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "SM-Protocol-ID", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "SM-Status", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "SM-User-Data-Header", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "SMS-Node", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "SMSC-Address", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Client-Address", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Number-Of-Messages-Sent", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Recipient-Info", + "Vendor": 10415 + }, + { + "AVP": "Originator-Received-Address", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "SM-Service-Type", + "Max": 1, + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Destination-Interface", + "Content": [ + { + "AVP": "Interface-Id", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Interface-Port", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Interface-Text", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Interface-Type", + "Max": 1, + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Originator-Interface", + "Content": [ + { + "AVP": "Interface-Id", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Interface-Port", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Interface-Text", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Interface-Type", + "Max": 1, + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Recipient-Info", + "Content": [ + { + "AVP": "Recipient-Address", + "Vendor": 10415 + }, + { + "AVP": "Destination-Interface", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Recipient-SCCP-Address", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "SM-Protocol-ID", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Recipient-Received-Address", + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Recipient-Received-Address", + "Content": [ + { + "AVP": "Address-Data", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Address-Domain", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Address-Type", + "Max": 1, + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "IM-Information", + "Content": [ + { + "AVP": "Number-Of-Messages-Successfully-Exploded", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Number-Of-Messages-Successfully-Sent", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Total-Number-Of-Messages-Exploded", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Total-Number-Of-Messages-Sent", + "Max": 1, + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "DCD-Information", + "Content": [ + { + "AVP": "Content-ID", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Content-provider-ID", + "Max": 1, + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Charging-Rule-Install", + "Content": [ + { + "AVP": "Charging-Rule-Definition", + "Vendor": 10415 + }, + { + "AVP": "Charging-Rule-Name", + "Vendor": 10415 + }, + { + "AVP": "Charging-Rule-Base-Name", + "Vendor": 10415 + }, + { + "AVP": "Bearer-Identifier", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Monitoring-Flags", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Rule-Activation-Time", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Rule-Deactivation-Time", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Resource-Allocation-Notification", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Charging-Correlation-Indicator", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "IP-CAN-Type", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Charging-Rule-Remove", + "Content": [ + { + "AVP": "Charging-Rule-Name", + "Vendor": 10415 + }, + { + "AVP": "Charging-Rule-Base-Name", + "Vendor": 10415 + }, + { + "AVP": "Required-Access-Info", + "Vendor": 10415 + }, + { + "AVP": "Resource-Release-Notification", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Charging-Rule-Definition", + "Content": [ + { + "AVP": "Charging-Rule-Name", + "Vendor": 10415, + "Min": 1, + "Max": 1 + }, + { + "AVP": "Service-Identifier", + "Max": 1 + }, + { + "AVP": "Rating-Group", + "Max": 1 + }, + { + "AVP": "Flow-Information", + "Vendor": 10415 + }, + { + "AVP": "Default-Bearer-Indication", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "TDF-Application-Identifier", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Flow-Status", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "QoS-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "PS-to-CS-Session-Continuity", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Reporting-Level", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Online", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Offline", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Metering-Method", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Precedence", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "AF-Charging-Identifier", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Flows", + "Vendor": 10415 + }, + { + "AVP": "Monitoring-Key", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Redirect-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Mute-Notification", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "AF-Signalling-Protocol", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Sponsor-Identity", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Application-Service-Provider-Identity", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Required-Access-Info", + "Vendor": 10415 + }, + { + "AVP": "Sharing-Key-DL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Sharing-Key-UL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Traffic-Steering-Policy-Identifier-DL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Traffic-Steering-Policy-Identifier-UL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Content-Version", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "TFT-Packet-Filter-Information", + "Content": [ + { + "AVP": "Precedence", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "TFT-Filter", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "ToS-Traffic-Class", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Security-Parameter-Index", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Flow-Label", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Flow-Direction", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "QoS-Information", + "Content": [ + { + "AVP": "QoS-Class-Identifier", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Max-Requested-Bandwidth-UL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Max-Requested-Bandwidth-DL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Extended-Max-Requested-BW-UL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Extended-Max-Requested-BW-DL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Guaranteed-Bitrate-UL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Guaranteed-Bitrate-DL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Extended-GBR-UL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Extended-GBR-DL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Bearer-Identifier", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Allocation-Retention-Priority", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "APN-Aggregate-Max-Bitrate-UL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "APN-Aggregate-Max-Bitrate-DL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Extended-APN-AMBR-UL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Extended-APN-AMBR-DL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Conditional-APN-Aggregate-Max-Bitrate", + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Charging-Rule-Report", + "Content": [ + { + "AVP": "Charging-Rule-Name", + "Vendor": 10415 + }, + { + "AVP": "Charging-Rule-Base-Name", + "Vendor": 10415 + }, + { + "AVP": "Bearer-Identifier", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "PCC-Rule-Status", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Rule-Failure-Code", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Final-Unit-Indication", + "Max": 1 + }, + { + "AVP": "RAN-NAS-Release-Cause", + "Vendor": 10415 + }, + { + "AVP": "Content-Version", + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Access-Network-Charging-Identifier-Gx", + "Content": [ + { + "AVP": "Access-Network-Charging-Identifier-Value", + "Vendor": 10415, + "Min": 1, + "Max": 1 + }, + { + "AVP": "Charging-Rule-Base-Name", + "Vendor": 10415 + }, + { + "AVP": "Charging-Rule-Name", + "Vendor": 10415 + }, + { + "AVP": "IP-CAN-Session-Charging-Scope", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Event-Report-Indication", + "Content": [ + { + "AVP": "AN-Trusted", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Event-Trigger", + "Vendor": 10415 + }, + { + "AVP": "User-CSG-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "IP-CAN-Type", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "AN-GW-Address", + "Vendor": 10415, + "Max": 2 + }, + { + "AVP": "3GPP-SGSN-Address", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-SGSN-IPv6-Address", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-SGSN-MCC-MNC", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Framed-IP-Address", + "Max": 1 + }, + { + "AVP": "RAT-Type", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "RAI", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-User-Location-Info", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Trace-Data", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Trace-Reference", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP2-BSID", + "Vendor": 5535, + "Max": 1 + }, + { + "AVP": "3GPP-MS-TimeZone", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Routing-IP-Address", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "UE-Local-IP-Address", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "HeNB-Local-IP-Address", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "UDP-Source-Port", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Presence-Reporting-Area-Information", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Allocation-Retention-Priority", + "Content": [ + { + "AVP": "Priority-Level", + "Vendor": 10415, + "Min": 1, + "Max": 1 + }, + { + "AVP": "Pre-emption-Capability", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Pre-emption-Vulnerability", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Tunnel-Information", + "Content": [ + { + "AVP": "Tunnel-Header-Length", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Tunnel-Header-Filter", + "Vendor": 10415, + "Min": 2, + "Max": 2 + } + ], + "Vendor": 10415 + }, + { + "AVP": "CoA-Information", + "Content": [ + { + "AVP": "Tunnel-Information", + "Vendor": 10415, + "Min": 1, + "Max": 1 + }, + { + "AVP": "CoA-IP-Address", + "Vendor": 10415, + "Min": 1, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Flow-Information", + "Content": [ + { + "AVP": "Flow-Description", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Packet-Filter-Identifier", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Packet-Filter-Usage", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "ToS-Traffic-Class", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Security-Parameter-Index", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Flow-Label", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Flow-Direction", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Routing-Rule-Identifier", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Packet-Filter-Information", + "Content": [ + { + "AVP": "Packet-Filter-Identifier", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Precedence", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Packet-Filter-Content", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "ToS-Traffic-Class", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Security-Parameter-Index", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Flow-Label", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Flow-Direction", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Routing-Rule-Install", + "Content": [ + { + "AVP": "Routing-Rule-Definition", + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Routing-Rule-Remove", + "Content": [ + { + "AVP": "Routing-Rule-Identifier", + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Routing-Rule-Definition", + "Content": [ + { + "AVP": "Routing-Rule-Identifier", + "Vendor": 10415, + "Min": 1, + "Max": 1 + }, + { + "AVP": "Routing-Filter", + "Vendor": 10415 + }, + { + "AVP": "Precedence", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Routing-IP-Address", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "IP-CAN-Type", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Routing-Filter", + "Content": [ + { + "AVP": "Flow-Description", + "Vendor": 10415, + "Min": 1, + "Max": 1 + }, + { + "AVP": "Flow-Direction", + "Vendor": 10415, + "Min": 1, + "Max": 1 + }, + { + "AVP": "ToS-Traffic-Class", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Security-Parameter-Index", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Flow-Label", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Redirect-Information", + "Content": [ + { + "AVP": "Redirect-Support", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Redirect-Address-Type", + "Max": 1 + }, + { + "AVP": "Redirect-Server-Address", + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Application-Detection-Information", + "Content": [ + { + "AVP": "TDF-Application-Identifier", + "Vendor": 10415, + "Min": 1, + "Max": 1 + }, + { + "AVP": "TDF-Application-Instance-Identifier", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Flow-Information", + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Default-QoS-Information", + "Content": [ + { + "AVP": "QoS-Class-Identifier", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Max-Requested-Bandwidth-UL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Max-Requested-Bandwidth-DL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Default-QoS-Name", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Conditional-APN-Aggregate-Max-Bitrate", + "Content": [ + { + "AVP": "APN-Aggregate-Max-Bitrate-UL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "APN-Aggregate-Max-Bitrate-DL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Extended-APN-AMBR-UL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Extended-APN-AMBR-DL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "IP-CAN-Type", + "Vendor": 10415 + }, + { + "AVP": "RAT-Type", + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Presence-Reporting-Area-Information", + "Content": [ + { + "AVP": "Presence-Reporting-Area-Identifier", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Presence-Reporting-Area-Status", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Presence-Reporting-Area-Elements-List", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Routing-Rule-Report", + "Content": [ + { + "AVP": "Routing-Rule-Identifier", + "Vendor": 10415 + }, + { + "AVP": "PCC-Rule-Status", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Routing-Rule-Failure-Code", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "Conditional-Policy-Information", + "Content": [ + { + "AVP": "Execution-Time", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Default-EPS-Bearer-QoS", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "APN-Aggregate-Max-Bitrate-UL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "APN-Aggregate-Max-Bitrate-DL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Conditional-APN-Aggregate-Max-Bitrate", + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "PRA-Install", + "Content": [ + { + "AVP": "Presence-Reporting-Area-Information", + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "PRA-Remove", + "Content": [ + { + "AVP": "Presence-Reporting-Area-Identifier", + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "QoS-Rule-Install", + "Content": [ + { + "AVP": "QoS-Rule-Definition", + "Vendor": 10415 + }, + { + "AVP": "QoS-Rule-Name", + "Vendor": 10415 + }, + { + "AVP": "QoS-Rule-Base-Name", + "Vendor": 10415 + }, + { + "AVP": "Tunnel-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Access-Network-Charging-Identifier-Value", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Resource-Allocation-Notification", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Rule-Activation-Time", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Rule-Deactivation-Time", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-GGSN-Address", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-GGSN-IPv6-Address", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "AN-GW-Address", + "Vendor": 10415, + "Max": 2 + }, + { + "AVP": "UDP-Source-Port", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "QoS-Rule-Remove", + "Content": [ + { + "AVP": "QoS-Rule-Name", + "Vendor": 10415 + }, + { + "AVP": "QoS-Rule-Base-Name", + "Vendor": 10415 + }, + { + "AVP": "Required-Access-Info", + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "QoS-Rule-Definition", + "Content": [ + { + "AVP": "QoS-Rule-Name", + "Vendor": 10415, + "Min": 1, + "Max": 1 + }, + { + "AVP": "Flow-Information", + "Vendor": 10415 + }, + { + "AVP": "QoS-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Precedence", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Required-Access-Info", + "Vendor": 10415 + }, + { + "AVP": "Sharing-Key-DL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Sharing-Key-UL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Content-Version", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "QoS-Rule-Report", + "Content": [ + { + "AVP": "QoS-Rule-Name", + "Vendor": 10415 + }, + { + "AVP": "QoS-Rule-Base-Name", + "Vendor": 10415 + }, + { + "AVP": "PCC-Rule-Status", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Rule-Failure-Code", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Content-Version", + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "ADC-Rule-Install", + "Content": [ + { + "AVP": "ADC-Rule-Definition", + "Vendor": 10415 + }, + { + "AVP": "ADC-Rule-Name", + "Vendor": 10415 + }, + { + "AVP": "ADC-Rule-Base-Name", + "Vendor": 10415 + }, + { + "AVP": "Monitoring-Flags", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Rule-Activation-Time", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Rule-Deactivation-Time", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "ADC-Rule-Remove", + "Content": [ + { + "AVP": "ADC-Rule-Name", + "Vendor": 10415 + }, + { + "AVP": "ADC-Rule-Base-Name", + "Vendor": 10415 + } + ], + "Vendor": 10415 + }, + { + "AVP": "ADC-Rule-Definition", + "Content": [ + { + "AVP": "ADC-Rule-Name", + "Vendor": 10415, + "Min": 1, + "Max": 1 + }, + { + "AVP": "TDF-Application-Identifier", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Flow-Information", + "Vendor": 10415 + }, + { + "AVP": "Service-Identifier", + "Max": 1 + }, + { + "AVP": "Rating-Group", + "Max": 1 + }, + { + "AVP": "Reporting-Level", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Online", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Offline", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Metering-Method", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Precedence", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Flow-Status", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "QoS-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Monitoring-Key", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Sponsor-Identity", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Application-Service-Provider-Identity", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Redirect-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Mute-Notification", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Traffic-Steering-Policy-Identifier-DL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Traffic-Steering-Policy-Identifier-UL", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "ToS-Traffic-Class", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "ADC-Rule-Report", + "Content": [ + { + "AVP": "ADC-Rule-Name", + "Vendor": 10415 + }, + { + "AVP": "ADC-Rule-Base-Name", + "Vendor": 10415 + }, + { + "AVP": "PCC-Rule-Status", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Rule-Failure-Code", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Final-Unit-Indication", + "Max": 1 + } + ], + "Vendor": 10415 + }, + { + "AVP": "CS-Service-Resource-Report", + "Content": [ + { + "AVP": "CS-Service-QoS-Request-Identifier", + "Vendor": 10415 + }, + { + "AVP": "CS-Service-Resource-Result-Operation", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "CS-Service-Resource-Failure-Cause", + "Vendor": 10415, + "Max": 1 + } + ], + "Vendor": 10415 + } + ], + "AVPs": [ + { + "Code": 9010, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "3GPP2-BSID", + "Type": "OctetString", + "Vendor": 5535 + }, + { + "Code": 1, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "3GPP-IMSI", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "3GPP-Charging-Id", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 3, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "3GPP-PDP-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 4, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "3GPP-CG-Address", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 5, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "3GPP-GPRS-Negotiated-QoS-Profile", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 6, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "3GPP-SGSN-Address", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 7, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "3GPP-GGSN-Address", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 8, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "3GPP-IMSI-MCC-MNC", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 9, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "3GPP-GGSN-MCC-MNC", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 10, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "3GPP-NSAPI", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 11, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "3GPP-Session-Stop-Indicator", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 12, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "3GPP-Selection-Mode", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 13, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "3GPP-Charging-Characteristics", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 14, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "3GPP-CG-IPv6-Address", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 15, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "3GPP-SGSN-IPv6-Address", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 16, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "3GPP-GGSN-IPv6-Address", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 17, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "3GPP-IPv6-DNS-Servers", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 18, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "3GPP-SGSN-MCC-MNC", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 20, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "3GPP-IMEISV", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 21, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "3GPP-RAT-Type", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 22, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "3GPP-User-Location-Info", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 23, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "3GPP-MS-TimeZone", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 24, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "3GPP-CAMEL-Charging-Info", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 25, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "3GPP-Packet-Filter", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 26, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "3GPP-Negotiated-DSCP", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 27, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "3GPP-Allocate-IP-Type", + "Type": "OctetString", + "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", + "MustNot": "" + }, + "Name": "Abort-Cause", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 501, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Access-Network-Charging-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 502, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Access-Network-Charging-Identifier", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 503, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Access-Network-Charging-Identifier-Value", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 504, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "AF-Application-Identifier", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 505, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "AF-Charging-Identifier", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 506, + "Flags": { + "Must": "M", + "MustNot": "VP" + }, + "Name": "Mobile-Node-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 507, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Flow-Description", + "Type": "IPFilterRule", + "Vendor": 10415 + }, + { + "Code": 509, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Flow-Number", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 510, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Flows", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 511, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Flow-Status", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 512, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Flow-Usage", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 513, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Specific-Action", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 515, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Max-Requested-Bandwidth-DL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 516, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Max-Requested-Bandwidth-UL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 517, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Media-Component-Description", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 518, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Media-Component-Number", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 519, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Media-Sub-Component", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 520, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Media-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 521, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "RR-Bandwidth", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 522, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "RS-Bandwidth", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 523, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SIP-Forking-Indication", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 524, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Codec-Data", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 525, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Service-URN", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 526, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Acceptable-Service-Info", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 527, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Service-Info-Status", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 528, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "MPS-Identifier", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 529, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "AF-Signalling-Protocol", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 530, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Sponsored-Connectivity-Data", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 531, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Sponsor-Identity", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 532, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Application-Service-Provider-Identity", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 533, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Rx-Request-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 534, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Min-Requested-Bandwidth-DL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 535, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Min-Requested-Bandwidth-UL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 536, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Required-Access-Info", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 537, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "IP-Domain-Id", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 538, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "GCS-Identifier", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 539, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Sharing-Key-DL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 540, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Sharing-Key-UL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 541, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Retry-Interval", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 542, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Sponsoring-Action", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 543, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Max-Supported-Bandwidth-DL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 544, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Max-Supported-Bandwidth-UL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 545, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Min-Desired-Bandwidth-DL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 546, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Min-Desired-Bandwidth-UL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 547, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "MCPTT-Identifier", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 548, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Service-Authorization-Info", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 549, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Media-Component-Status", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 550, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Priority-Sharing-Indicator", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 551, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "AF-Requested-Data", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 552, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Content-Version", + "Type": "Unsigned64", + "Vendor": 10415 + }, + { + "Code": 553, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Pre-emption-Control-Info", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 554, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Extended-Max-Requested-BW-DL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 555, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Extended-Max-Requested-BW-UL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 556, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Extended-Max-Supported-BW-DL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 557, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Extended-Max-Supported-BW-UL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 558, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Extended-Min-Desired-BW-DL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 559, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Extended-Min-Desired-BW-UL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 560, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Extended-Min-Requested-BW-DL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 561, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Extended-Min-Requested-BW-UL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 578, + "Flags": { + "Must": "M", + "MustNot": "VP" + }, + "Name": "QoS-Capability", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 600, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Visited-Network-Identifier", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 601, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Public-Identity", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 602, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Server-Name", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 603, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Server-Capabilities", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 604, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Mandatory-Capability", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 605, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Optional-Capability", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 606, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "User-Data", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 607, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SIP-Number-Auth-Items", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 608, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SIP-Authentication-Scheme", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 609, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SIP-Authenticate", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 610, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SIP-Authorization", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 611, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SIP-Authentication-Context", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 612, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SIP-Auth-Data-Item", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 613, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SIP-Item-Number", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 614, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Server-Assignment-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 615, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Deregistration-Reason", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 616, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Reason-Code", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 617, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Reason-Info", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 618, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Charging-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 619, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Primary-Event-Charging-Function-Name", + "Type": "DiameterURI", + "Vendor": 10415 + }, + { + "Code": 620, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Secondary-Event-Charging-Function-Name", + "Type": "DiameterURI", + "Vendor": 10415 + }, + { + "Code": 621, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Primary-Charging-Collection-Function-Name", + "Type": "DiameterURI", + "Vendor": 10415 + }, + { + "Code": 622, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Secondary-Charging-Collection-Function-Name", + "Type": "DiameterURI", + "Vendor": 10415 + }, + { + "Code": 623, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "User-Authorization-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 624, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "User-Data-Already-Available", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 625, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Confidentiality-Key", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 626, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Integrity-Key", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 628, + "Flags": { + "Must": "V", + "MustNot": "" + }, + "Name": "Supported-Features", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 629, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Feature-List-ID", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 630, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Feature-List", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 631, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Supported-Applications", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 632, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Associated-Identities", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 633, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Originating-Request", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 634, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Wildcarded-Public-Identity", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 635, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "SIP-Digest-Authenticate", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 636, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Wildcarded-IMPU", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 637, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "UAR-Flags", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 638, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Loose-Route-Indication", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 639, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "SCSCF-Restoration-Info", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 640, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Path", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 641, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Contact", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 642, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Subscription-Info", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 643, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Call-ID-SIP-Header", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 644, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "From-SIP-Header", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 645, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "To-SIP-Header", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 646, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Record-Route", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 647, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Associated-Registered-Identities", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 648, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Multiple-Registration-Indication", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 649, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Restoration-Info", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 650, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Session-Priority", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 651, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Identity-with-Emergency-Registration", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 652, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Priviledged-Sender-Indication", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 653, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "LIA-Flags", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 700, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "User-Identity", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 701, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MSISDN", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 702, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "User-Data-29.329", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 703, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Data-Reference", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 704, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Service-Indication", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 705, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Subs-Req-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 706, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Requested-Domain", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 707, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Current-Location", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 708, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Identity-Set", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 709, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Expiry-Time", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 710, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Send-Data-Indication", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 711, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "DSAI-Tag", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 712, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "One-Time-Notification", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 713, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Requested-Nodes", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 714, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Serving-Node-Indication", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 715, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Repository-Data-ID", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 716, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Sequence-Number", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 719, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "UDR-Flags", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 823, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Event-Type", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 824, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SIP-Method", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 825, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Event", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 826, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Content-Type", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 827, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Content-Length", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 828, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Content-Disposition", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 829, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Role-Of-Node", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 830, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "User-Session-Id", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 831, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Calling-Party-Address", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 832, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Called-Party-Address", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 833, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Time-Stamps", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 834, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SIP-Request-Timestamp", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 835, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SIP-Response-Timestamp", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 836, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Application-Server", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 837, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Application-Provided-Called-Party-Address", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 838, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Inter-Operator-Identifier", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 839, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Originating-IOI", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 840, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Terminating-IOI", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 841, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "IMS-Charging-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 842, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SDP-Session-Description", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 843, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SDP-Media-Component", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 844, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SDP-Media-Name", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 845, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SDP-Media-Description", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 846, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "CG-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 847, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "GGSN-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 848, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Served-Party-IP-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 849, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Authorised-QoS", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 850, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Application-Server-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 851, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Trunk-Group-Id", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 852, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Incoming-Trunk-Group-Id", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 853, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Outgoing-Trunk-Group-Id", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 854, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Bearer-Service", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 855, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Service-Id", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 856, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Associated-URI", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 857, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Charged-Party", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 858, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PoC-Controlling-Address", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 859, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PoC-Group-Name", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 861, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Cause-Code", + "Type": "Integer32", + "Vendor": 10415 + }, + { + "Code": 862, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Node-Functionality", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 863, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Service-Specific-Data", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 864, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Originator", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 865, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PS-Furnish-Charging-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 866, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PS-Free-Format-Data", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 867, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PS-Append-Free-Format-Data", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 868, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Time-Quota-Threshold", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 869, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Volume-Quota-Threshold", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 870, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Trigger-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 871, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Quota-Holding-Time", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 872, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Reporting-Reason", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 873, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Service-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 874, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PS-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 876, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "IMS-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 877, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MMS-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 878, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "LCS-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 879, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PoC-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 880, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 881, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Quota-Consumption-Time", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 882, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Media-Initiator-Flag", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 883, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PoC-Server-Role", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 884, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PoC-Session-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 885, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Number-Of-Participants", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 886, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Originator-Address", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 887, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Participants-Involved", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 888, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Expires", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 889, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Message-Body", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 897, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Address-Data", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 898, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Address-Domain", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 899, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Address-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 900, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "TMGI", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 901, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Required-MBMS-Bearer-Capabilities", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 902, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-StartStop-Indication", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 903, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-Service-Area", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 904, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-Session-Duration", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 905, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Alternative-APN", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 906, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-Service-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 907, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-2G-3G-Indicator", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 908, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-Session-Identity", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 909, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "RAI", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 910, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Additional-MBMS-Trace-Info", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 911, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-Time-To-Data-Transfer", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 912, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-Session-Repetition-Number", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 913, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-Required-QoS", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 914, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-Counting-Information", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 915, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-User-Data-Mode-Indication", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 916, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-GGSN-Address", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 917, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-GGSN-IPv6-Address", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 918, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-BMSC-SSM-IP-Address", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 919, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-BMSC-SSM-IPv6-Address", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 920, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-Flow-Identifier", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 921, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "CN-IP-Multicast-Distribution", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 922, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-HC-Indicator", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1000, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Bearer-Usage", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1001, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Charging-Rule-Install", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1002, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Charging-Rule-Remove", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1003, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Charging-Rule-Definition", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1004, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Charging-Rule-Base-Name", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1005, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Charging-Rule-Name", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1006, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Event-Trigger", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1007, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Metering-Method", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1008, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Offline", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1009, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Online", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1010, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Precedence", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1011, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Reporting-Level", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1012, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "TFT-Filter", + "Type": "IPFilterRule", + "Vendor": 10415 + }, + { + "Code": 1013, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "TFT-Packet-Filter-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1014, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ToS-Traffic-Class", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1016, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "QoS-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1018, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Charging-Rule-Report", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1019, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PCC-Rule-Status", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1020, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Bearer-Identifier", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1021, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Bearer-Operation", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1022, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Access-Network-Charging-Identifier-Gx", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1023, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Bearer-Control-Mode", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1024, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Network-Request-Support", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1025, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Guaranteed-Bitrate-DL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1026, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Guaranteed-Bitrate-UL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1027, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "IP-CAN-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1028, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "QoS-Class-Identifier", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1029, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "QoS-Negotiation", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1030, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "QoS-Upgrade", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1031, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Rule-Failure-Code", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1032, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "RAT-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1033, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Event-Report-Indication", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1034, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Allocation-Retention-Priority", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1035, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "CoA-IP-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 1036, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Tunnel-Header-Filter", + "Type": "IPFilterRule", + "Vendor": 10415 + }, + { + "Code": 1037, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Tunnel-Header-Length", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1038, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Tunnel-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1039, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "CoA-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1040, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "APN-Aggregate-Max-Bitrate-DL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1041, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "APN-Aggregate-Max-Bitrate-UL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1042, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Revalidation-Time", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 1043, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Rule-Activation-Time", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 1044, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Rule-Deactivation-Time", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 1045, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Session-Release-Cause", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1046, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Priority-Level", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1047, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Pre-emption-Capability", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1048, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Pre-emption-Vulnerability", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1049, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Default-EPS-Bearer-QoS", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1050, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "AN-GW-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 1051, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "QoS-Rule-Install", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1052, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "QoS-Rule-Remove", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1053, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "QoS-Rule-Definition", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1054, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "QoS-Rule-Name", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1055, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "QoS-Rule-Report", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1056, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Security-Parameter-Index", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1057, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Flow-Label", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1058, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Flow-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1059, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Packet-Filter-Content", + "Type": "IPFilterRule", + "Vendor": 10415 + }, + { + "Code": 1060, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Packet-Filter-Identifier", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1061, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Packet-Filter-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1062, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Packet-Filter-Operation", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1063, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Resource-Allocation-Notification", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1064, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Session-Linking-Indicator", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1065, + "Flags": { + "Must": "V", + "MustNot": "" + }, + "Name": "PDN-Connection-ID", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1066, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Monitoring-Key", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1067, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Usage-Monitoring-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1068, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Usage-Monitoring-Level", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1069, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Usage-Monitoring-Report", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1070, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Usage-Monitoring-Support", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1071, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "CSG-Information-Reporting", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1072, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Packet-Filter-Usage", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1073, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Charging-Correlation-Indicator", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1074, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "QoS-Rule-Base-Name", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1075, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Routing-Rule-Remove", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1076, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Routing-Rule-Definition", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1077, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Routing-Rule-Identifier", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1078, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Routing-Filter", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1079, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Routing-IP-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 1080, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Flow-Direction", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1081, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Routing-Rule-Install", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1082, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Credit-Management-Status", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1085, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Redirect-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1086, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Redirect-Support", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1087, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "TDF-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1088, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "TDF-Application-Identifier", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1089, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "TDF-Destination-Host", + "Type": "DiameterIdentity", + "Vendor": 10415 + }, + { + "Code": 1090, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "TDF-Destination-Realm", + "Type": "DiameterIdentity", + "Vendor": 10415 + }, + { + "Code": 1091, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "TDF-IP-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 1092, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ADC-Rule-Install", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1093, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ADC-Rule-Remove", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1094, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ADC-Rule-Definition", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1095, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ADC-Rule-Base-Name", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1096, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ADC-Rule-Name", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1097, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ADC-Rule-Report", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1098, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Application-Detection-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1099, + "Flags": { + "Must": "V", + "MustNot": "" + }, + "Name": "PS-to-CS-Session-Continuity", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1100, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Served-User-Identity", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1101, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "VASP-ID", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1102, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "VAS-ID", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1103, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Trigger-Event", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1104, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Sender-Address", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1105, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Initial-Recipient-Address", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1106, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Result-Recipient-Address", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1107, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Sequence-Number-29.140", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1108, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Recipient-Address-29.140", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1109, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Routeing-Address", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1110, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Originating-Interface", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1111, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Delivery-Report", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1112, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Read-Reply", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1113, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Sender-Visibility", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1114, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Service-Key", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1115, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Billing-Information", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1116, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Status-29.140", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1117, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Status-Code", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1118, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Status-Text", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1119, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Routeing-Address-Resolution", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1200, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Domain-Name", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1201, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Recipient-Address", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1202, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Submission-Time", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 1203, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MM-Content-Type", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1204, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Type-Number", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1205, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Additional-Type-Information", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1206, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Content-Size", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1207, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Additional-Content-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1208, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Addressee-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1209, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Priority", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1210, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Message-ID", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1211, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Message-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1212, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Message-Size", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1213, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Message-Class", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1214, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Class-Identifier", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1215, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Token-Text", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1216, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Delivery-Report-Requested", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1217, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Adaptations", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1218, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Applic-ID", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1219, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Aux-Applic-Info", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1220, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Content-Class", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1221, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "DRM-Content", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1222, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Read-Reply-Report-Requested", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1223, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Reply-Applic-ID", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1224, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "File-Repair-Supported", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1225, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-User-Service-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1226, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Unit-Quota-Threshold", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1227, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PDP-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 1228, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SGSN-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 1229, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PoC-Session-Id", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1230, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Deferred-Location-Event-Type", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1231, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "LCS-APN", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1232, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "LCS-Client-Id", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1233, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "LCS-Client-Dialed-By-MS", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1234, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "LCS-Client-External-ID", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1235, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "LCS-Client-Name", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1236, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "LCS-Data-Coding-Scheme", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1237, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "LCS-Format-Indicator", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1238, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "LCS-Name-String", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1239, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "LCS-Requestor-ID", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1240, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "LCS-Requestor-ID-String", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1241, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "LCS-Client-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1242, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Location-Estimate", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1243, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Location-Estimate-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1244, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Location-Type", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1245, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Positioning-Data", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1247, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PDP-Context-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1248, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MMBox-Storage-Requested", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1249, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Service-Specific-Info", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1250, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Called-Asserted-Identity", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1251, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Requested-Party-Address", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1252, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PoC-User-Role", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1253, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PoC-User-Role-IDs", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1254, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PoC-User-Role-Info-Units", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1255, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Talk-Burst-Exchange", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1257, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Service-Specific-Type", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1258, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Event-Charging-TimeStamp", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 1259, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Participant-Access-Priority", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1260, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Participant-Group", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1261, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PoC-Change-Condition", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1262, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PoC-Change-Time", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 1263, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Access-Network-Information", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1264, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Trigger", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1265, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Base-Time-Interval", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1266, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Envelope", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1267, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Envelope-End-Time", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 1268, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Envelope-Reporting", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1269, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Envelope-Start-Time", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 1270, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Time-Quota-Mechanism", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1271, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Time-Quota-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1272, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Early-Media-Description", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1273, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SDP-TimeStamps", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1274, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SDP-Offer-Timestamp", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 1275, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SDP-Answer-Timestamp", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 1276, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "AF-Correlation-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1277, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PoC-Session-Initiation-type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1278, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Offline-Charging", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1279, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "User-Participating-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1280, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Alternate-Charged-Party-Address", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1281, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "IMS-Communication-Service-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1282, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Number-Of-Received-Talk-Bursts", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1283, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Number-Of-Talk-Bursts", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1284, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Received-Talk-Burst-Time", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1285, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Received-Talk-Burst-Volume", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1286, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Talk-Burst-Time", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1287, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Talk-Burst-Volume", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1288, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Media-Initiator-Party", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1400, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Subscription-Data", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1401, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Terminal-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1402, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "IMEI", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1403, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Software-Version", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1404, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "QoS-Subscribed", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1405, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ULR-Flags", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1406, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ULA-Flags", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1407, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Visited-PLMN-Id", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1408, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Requested-EUTRAN-Authentication-Info", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1409, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Requested-UTRAN-GERAN-Authentication-Info", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1410, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Number-Of-Requested-Vectors", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1411, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Re-Synchronization-Info", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1412, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Immediate-Response-Preferred", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1413, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Authentication-Info", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1414, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "E-UTRAN-Vector", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1415, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "UTRAN-Vector", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1416, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "GERAN-Vector", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1417, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Network-Access-Mode", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1418, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "HPLMN-ODB", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1419, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Item-Number", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1420, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Cancellation-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1421, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "DSR-Flags", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1422, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "DSA-Flags", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1423, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Context-Identifier", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1424, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Subscriber-Status", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1425, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Operator-Determined-Barring", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1426, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Access-Restriction-Data", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1427, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "APN-OI-Replacement", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1428, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "All-APN-Configurations-Included-Indicator", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1429, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "APN-Configuration-Profile", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1430, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "APN-Configuration", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1431, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "EPS-Subscribed-QoS-Profile", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1432, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "VPLMN-Dynamic-Address-Allowed", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1433, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "STN-SR", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1434, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Alert-Reason", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1435, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "AMBR", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1436, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "CSG-Subscription-Data", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1437, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "CSG-Id", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1438, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PDN-GW-Allocation-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1439, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Expiration-Date", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 1440, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "RAT-Frequency-Selection-Priority-ID", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1441, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "IDA-Flags", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1442, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PUA-Flags", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1443, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "NOR-Flags", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1444, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "User-Id", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1445, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Equipment-Status", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1446, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Regional-Subscription-Zone-Code", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1447, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "RAND", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1448, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "XRES", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1449, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "AUTN", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1450, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "KASME", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1452, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Trace-Collection-Entity", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 1453, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Kc", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1454, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SRES", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1456, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PDN-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1457, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Roaming-Restricted-Due-To-Unsupported-Feature", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1458, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Trace-Data", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1459, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Trace-Reference", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1462, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Trace-Depth", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1463, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Trace-NE-Type-List", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1464, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Trace-Interface-List", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1465, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Trace-Event-List", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1466, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "OMC-Id", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1467, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "GPRS-Subscription-Data", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1468, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Complete-Data-List-Included-Indicator", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1469, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PDP-Context", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1470, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PDP-Type", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1471, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "3GPP2-MEID", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1472, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Specific-APN-Info", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1473, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "LCS-Info", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1474, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "GMLC-Number", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1475, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "LCS-PrivacyException", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1476, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SS-Code", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1477, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SS-Status", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1478, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Notification-To-UE-User", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1479, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "External-Client", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1480, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Client-Identity", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1481, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "GMLC-Restriction", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1482, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PLMN-Client", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1483, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Service-Type", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1484, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ServiceTypeIdentity", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1485, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MO-LR", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1486, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Teleservice-List", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1487, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "TS-Code", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1488, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Call-Barring-Infor-List", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1489, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SGSN-Number", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1490, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "IDR-Flags", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1491, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "ICS-Indicator", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1492, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "IMS-Voice-Over-PS-Sessions-Supported", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1493, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Homogeneous-Support-of-IMS-Voice-Over-PS-Sessions", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1494, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Last-UE-Activity-Time", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 1495, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "EPS-User-State", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1496, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "EPS-Location-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1497, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "MME-User-State", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1498, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "SGSN-User-State", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1499, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "User-State", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1503, + "Flags": { + "Must": "VM", + "MustNot": "P" + }, + "Name": "AN-Trusted", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1504, + "Flags": { + "Must": "VM", + "MustNot": "P" + }, + "Name": "ANID", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1506, + "Flags": { + "Must": "VM", + "MustNot": "P" + }, + "Name": "MIP-FA-RK", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1507, + "Flags": { + "Must": "VM", + "MustNot": "P" + }, + "Name": "MIP-FA-RK-SPI", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1509, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "WLAN-Identifier", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1516, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "Full-Network-Name", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1517, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "Short-Network-Name", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1518, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "AAA-Failure-Indication", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1519, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "Transport-Access-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1520, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "DER-Flags", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1521, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "DEA-Flags", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1524, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "SSID", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1525, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "HESSID", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1526, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "Access-Network-Info", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1527, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "TWAN-Connection-Mode", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1528, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "TWAN-Connectivity-Parameters", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1529, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "Connectivity-Flags", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1530, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "TWAN-PCO", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1531, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "TWAG-CP-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 1532, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "TWAG-UP-Address", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1533, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "TWAN-S2a-Failure-Cause", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1534, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "SM-Back-Off-Timer", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1535, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "WLCP-Key", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1538, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "Emergency-Services", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1540, + "Flags": { + "Must": "V", + "MustNot": "MP" + }, + "Name": "IMEI-Check-In-VPLMN-Result", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1600, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "MME-LocationInformation", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1601, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "SGSN-Location-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1602, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "E-UTRAN-Cell-Global-Identity", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1603, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Tracking-Area-Identity", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1604, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Cell-Global-Identity", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1605, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Routing-Area-Identity", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1606, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Location-Area-Identity", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1607, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Service-Area-Identity", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1608, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Geographical-Information", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1609, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Geodetic-Information", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1610, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Current-Location-Retrieved", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1611, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Age-Of-Location-Information", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1612, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Active-APN", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1613, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "SIPTO-Permission", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1614, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Error-Diagnostic", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1615, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "UE-SRVCC-Capability", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1616, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "MPS-Priority", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1617, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "VPLMN-LIPA-Allowed", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1618, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "LIPA-Permission", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1619, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Subscribed-Periodic-RAU-TAU-Timer", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1620, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Ext-PDP-Type", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1621, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Ext-PDP-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 1622, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "MDT-Configuration", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1623, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Job-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1624, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Area-Scope", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1625, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "List-Of-Measurements", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1626, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Reporting-Trigger", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1627, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Report-Interval", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1628, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Report-Amount", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1629, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Event-Threshold-RSRP", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1630, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Event-Threshold-RSRQ", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1631, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Logging-Interval", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1632, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Logging-Duration", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1633, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Relay-Node-Indicator", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1634, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "MDT-User-Consent", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1635, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "PUR-Flags", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1636, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Subscribed-VSRVCC", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1637, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Equivalent-PLMN-List", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1638, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "CLR-Flags", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1639, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "UVR-Flags", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1640, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "UVA-Flags", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1641, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "VPLMN-CSG-Subscription-Data", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1642, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Time-Zone", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 1643, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "A-MSISDN", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1645, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "MME-Number-for-MT-SMS", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1648, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "SMS-Register-Request", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1649, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Local-Time-Zone", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 1650, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Daylight-Saving-Time", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1654, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Subscription-Data-Flags", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 1655, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Measurement-Period-UMTS", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1656, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Measurement-Period-LTE", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1657, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Collection-Period-RRM-LTE", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1658, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Collection-Period-RRM-UMTS", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 1659, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Positioning-Method", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1660, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Measurement-Quantity", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 1661, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Event-Threshold-Event-1F", + "Type": "Integer32", + "Vendor": 10415 + }, + { + "Code": 1662, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Event-Threshold-Event-1I", + "Type": "Integer32", + "Vendor": 10415 + }, + { + "Code": 2000, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SMS-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2001, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Data-Coding-Scheme", + "Type": "Integer32", + "Vendor": 10415 + }, + { + "Code": 2002, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Destination-Interface", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2003, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Interface-Id", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2004, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Interface-Port", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2005, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Interface-Text", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2006, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Interface-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2007, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SM-Message-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2008, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Originator-SCCP-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 2009, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Originator-Interface", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2010, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Recipient-SCCP-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 2011, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Reply-Path-Requested", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2012, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SM-Discharge-Time", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 2013, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SM-Protocol-ID", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 2014, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SM-Status", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 2015, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SM-User-Data-Header", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 2016, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SMS-Node", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2017, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SMSC-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 2018, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Client-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 2019, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Number-Of-Messages-Sent", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2020, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Low-Balance-Indication", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2021, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Remaining-Balance", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2022, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Refund-Information", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 2023, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Carrier-Select-Routing-Information", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2024, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Number-Portability-Routing-Information", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2025, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PoC-Event-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2026, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Recipient-Info", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2027, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Originator-Received-Address", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2028, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Recipient-Received-Address", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2029, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SM-Service-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2030, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MMTel-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2031, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MMTel-SService-Type", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2032, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Service-Mode", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2033, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Subscriber-Role", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2034, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Number-Of-Diversions", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2035, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Associated-Party-Address", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2036, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SDP-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2037, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Change-Condition", + "Type": "Integer32", + "Vendor": 10415 + }, + { + "Code": 2038, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Change-Time", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 2039, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Diagnostics", + "Type": "Integer32", + "Vendor": 10415 + }, + { + "Code": 2040, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Service-Data-Container", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2041, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Start-Time", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 2042, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Stop-Time", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 2043, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Time-First-Usage", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 2044, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Time-Last-Usage", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 2045, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Time-Usage", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2046, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Traffic-Data-Volumes", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2047, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Serving-Node-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2048, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Supplementary-Service", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2049, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Participant-Action-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2050, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PDN-Connection-Charging-ID", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2051, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Dynamic-Address-Flag", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2052, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Accumulated-Cost", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2053, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "AoC-Cost-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2054, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "AoC-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2055, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "AoC-Request-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2056, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Current-Tariff", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2057, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Next-Tariff", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2058, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Rate-Element", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2059, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Scale-Factor", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2060, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Tariff-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2061, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Unit-Cost", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2062, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Incremental-Cost", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2063, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Local-Sequence-Number", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2064, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Node-Id", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2065, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SGW-Change", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2066, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Charging-Characteristics-Selection-Mode", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2067, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SGW-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 2068, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Dynamic-Address-Flag-Extension", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2101, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Application-Server-Id", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2102, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Application-Service-Type", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2103, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Application-Session-Id", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2104, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Delivery-Status", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2110, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "IM-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2111, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Number-Of-Messages-Successfully-Exploded", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2112, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Number-Of-Messages-Successfully-Sent", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2113, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Total-Number-Of-Messages-Exploded", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2114, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Total-Number-Of-Messages-Sent", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2115, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "DCD-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2116, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Content-ID", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2117, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Content-provider-ID", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2118, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Charge-Reason-Code", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2301, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SIP-Request-Timestamp-Fraction", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2302, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SIP-Response-Timestamp-Fraction", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2303, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Online-Charging-Flag", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2304, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "CUG-Information", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 2305, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Real-Time-Tariff-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2306, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Tariff-XML", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2307, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-GW-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 2308, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "IMSI-Unauthenticated-Flag", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2309, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Account-Expiration", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 2310, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "AoC-Format", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2311, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "AoC-Service", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2312, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "AoC-Service-Obligatory-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2313, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "AoC-Service-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2314, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "AoC-Subscription-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2317, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "CSG-Access-Mode", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2318, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "CSG-Membership-Indication", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2319, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "User-CSG-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2320, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Outgoing-Session-Id", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2321, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Initial-IMS-Charging-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2322, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "IMS-Emergency-Indicator", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2323, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MBMS-Charged-Party", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2400, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "LMSI", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 2401, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Serving-Node", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2402, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MME-Name", + "Type": "DiameterIdentity", + "Vendor": 10415 + }, + { + "Code": 2403, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MSC-Number", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 2404, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "LCS-Capabilities-Sets", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2405, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "GMLC-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 2406, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Additional-Serving-Node", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2407, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PPR-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 2408, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "MME-Realm", + "Type": "DiameterIdentity", + "Vendor": 10415 + }, + { + "Code": 2409, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "SGSN-Name", + "Type": "DiameterIdentity", + "Vendor": 10415 + }, + { + "Code": 2410, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "SGSN-Realm", + "Type": "DiameterIdentity", + "Vendor": 10415 + }, + { + "Code": 2601, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "IMS-Application-Reference-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2602, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Low-Priority-Indicator", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2603, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "IP-Realm-Default-Indication", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2604, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Local-GW-Inserted-Indication", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2605, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Transcoder-Inserted-Indication", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2606, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PDP-Address-Prefix-Length", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2701, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Transit-IOI-List", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2702, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Status-AS-Code", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2703, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "NNI-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2704, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "NNI-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2705, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Neighbour-Node-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 2706, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Relationship-Mode", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2707, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Session-Direction", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2708, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "From-Address", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2709, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Access-Transfer-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2710, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Access-Transfer-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2711, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Related-IMS-Charging-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2712, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Related-IMS-Charging-Identifier-Node", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 2713, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "IMS-Visited-Network-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2714, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "TWAN-User-Location-Info", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2716, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "BSSID", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2717, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "TAD-Identifier", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2802, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "TDF-Application-Instance-Identifier", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 2804, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "HeNB-Local-IP-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 2805, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "UE-Local-IP-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 2806, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "UDP-Source-Port", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2807, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "CS-Service-QoS-Request-Identifier", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 2808, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "CS-Service-QoS-Request-Operation", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2809, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Mute-Notification", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2810, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Monitoring-Time", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 2811, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "AN-GW-Status", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2812, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "User-Location-Info-Time", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 2813, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "CS-Service-Resource-Report", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2814, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "CS-Service-Resource-Failure-Cause", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2815, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "CS-Service-Resource-Result-Operation", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2816, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Default-QoS-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2817, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Default-QoS-Name", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 2818, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Conditional-APN-Aggregate-Max-Bitrate", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2819, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "RAN-NAS-Release-Cause", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 2820, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Presence-Reporting-Area-Elements-List", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 2821, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Presence-Reporting-Area-Identifier", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 2822, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Presence-Reporting-Area-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2823, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Presence-Reporting-Area-Status", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2824, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "NetLoc-Access-Support", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2825, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Fixed-User-Location-Info", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2826, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "PCSCF-Restoration-Indication", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2827, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "IP-CAN-Session-Charging-Scope", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2828, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Monitoring-Flags", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2829, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Default-Access", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2830, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "NBIFOM-Mode", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2831, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "NBIFOM-Support", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2832, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "RAN-Rule-Support", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2833, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Access-Availability-Change-Reason", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2834, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Routing-Rule-Failure-Code", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2835, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Routing-Rule-Report", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2836, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Traffic-Steering-Policy-Identifier-DL", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 2837, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Traffic-Steering-Policy-Identifier-UL", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 2838, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Request-Type", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2839, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Execution-Time", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 2840, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Conditional-Policy-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2841, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Resource-Release-Notification", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2842, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Removal-Of-Access", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2843, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "TCP-Source-Port", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2844, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Default-Bearer-Indication", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2845, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "PRA-Install", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2846, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "PRA-Remove", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 2847, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "3GPP-PS-Data-Off-Status", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 2848, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Extended-APN-AMBR-DL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2849, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Extended-APN-AMBR-UL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2850, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Extended-GBR-DL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 2851, + "Flags": { + "Must": "V", + "MustNot": "M" + }, + "Name": "Extended-GBR-UL", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 3401, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Reason-Header", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 3402, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Instance-Id", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 3403, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Route-Header-Received", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 3404, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Route-Header-Transmitted", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 3405, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SM-Device-Trigger-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3406, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MTC-IWF-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 3407, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SM-Device-Trigger-Indicator", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 3408, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SM-Sequence-Number", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 3409, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SMS-Result", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 3410, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "VCS-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3411, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Basic-Service-Code", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3412, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Bearer-Capability", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 3413, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Teleservice", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 3414, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ISUP-Location-Number", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 3415, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Forwarding-Pending", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 3416, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ISUP-Cause", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3417, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "MSC-Address", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 3418, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Network-Call-Reference-Number", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 3419, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Start-of-Charging", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 3420, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "VLR-Number", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 3421, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "CN-Operator-Selection-Entity", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 3422, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ISUP-Cause-Diagnostics", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 3423, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ISUP-Cause-Location", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 3424, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ISUP-Cause-Value", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 3425, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "EPDG-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 3426, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Announcing-UE-HPLMN-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 3427, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Announcing-UE-VPLMN-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 3428, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Coverage-Status", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 3429, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Layer-2-Group-ID", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 3430, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Monitored-PLMN-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 3431, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Monitoring-UE-HPLMN-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 3432, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Monitoring-UE-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 3433, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Monitoring-UE-VPLMN-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 3434, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PC3-Control-Protocol-Cause", + "Type": "Integer32", + "Vendor": 10415 + }, + { + "Code": 3435, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "PC3-EPC-Control-Protocol-Cause", + "Type": "Integer32", + "Vendor": 10415 + }, + { + "Code": 3436, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Requested-PLMN-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 3437, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Requestor-PLMN-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 3438, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Role-Of-ProSe-Function", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 3439, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Usage-Information-Report-Sequence-Number", + "Type": "Integer32", + "Vendor": 10415 + }, + { + "Code": 3440, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ProSe-3rd-Party-Application-ID", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 3441, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ProSe-Direct-Communication-Transmission-Data-Container", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3442, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ProSe-Direct-Discovery-Model", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 3443, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ProSe-Event-Type", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 3444, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ProSe-Function-IP-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 3445, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ProSe-Functionality", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 3446, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ProSe-Group-IP-Multicast-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 3447, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ProSe-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3448, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ProSe-Range-Class", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 3449, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ProSe-Reason-For-Cancellation", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 3450, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ProSe-Request-Timestamp", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 3451, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ProSe-Role-Of-UE", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 3452, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ProSe-Source-IP-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 3453, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ProSe-UE-ID", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 3454, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Proximity-Alert-Indication", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 3455, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Proximity-Alert-Timestamp", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 3456, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Proximity-Cancellation-Timestamp", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 3457, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ProSe-Function-PLMN-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 3458, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Application-Specific-Data", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 3459, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Coverage-Info", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3460, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Location-Info", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3461, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ProSe-Direct-Communication-Reception-Data-Container", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3462, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Radio-Frequency", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 3463, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Radio-Parameter-Set-Info", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3464, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Radio-Parameter-Set-Values", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 3465, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Radio-Resources-Indicator", + "Type": "Integer32", + "Vendor": 10415 + }, + { + "Code": 3466, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Time-First-Reception", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 3467, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Time-First-Transmission", + "Type": "Time", + "Vendor": 10415 + }, + { + "Code": 3468, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Transmitter-Info", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3901, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Enhanced-Diagnostics", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3902, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Inter-UE-Transfer", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 3903, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "TWAG-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 3904, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Announcement-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3905, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Announcement-Identifier", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 3906, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Announcement-Order", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 3907, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Variable-Part", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3908, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Variable-Part-Order", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 3909, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Variable-Part-Type", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 3910, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Variable-Part-Value", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 3911, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Time-Indicator", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 3912, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Quota-Indicator", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 3913, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Play-Alternative", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 3914, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Language", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 3915, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Privacy-Indicator", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 3916, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Called-Identity", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 3917, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Called-Identity-Change", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3918, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "UWAN-User-Location-Info", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3919, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Monitoring-Event-Configuration-Activity", + "Type": "Integer32", + "Vendor": 10415 + }, + { + "Code": 3920, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Monitoring-Event-Report-Data", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3921, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Monitoring-Event-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3922, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Monitoring-Event-Functionality", + "Type": "Integer32", + "Vendor": 10415 + }, + { + "Code": 3923, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Monitoring-Event-Report-Number", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 3924, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Cellular-Network-Information", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 3925, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Related-Change-Condition-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3926, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Related-Trigger", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3927, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "CPDT-Information", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3928, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "NIDD-Submission", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3929, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Serving-Node-Identity", + "Type": "DiameterIdentity", + "Vendor": 10415 + }, + { + "Code": 3930, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "CP-CIoT-EPS-Optimisation-Indicator", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 3931, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SGi-PtP-Tunnelling-Method", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 3932, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "UNI-PDU-CP-Only-Flag", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 3933, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "APN-Rate-Control", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3934, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "APN-Rate-Control-Downlink", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3935, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "APN-Rate-Control-Uplink", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3936, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Additional-Exception-Reports", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 3937, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Rate-Control-Max-Message-Size", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 3938, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Rate-Control-Max-Rate", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 3939, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Rate-Control-Time-Unit", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 3940, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SCS-AS-Address", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 3941, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SCS-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 3942, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "SCS-Realm", + "Type": "DiameterIdentity", + "Vendor": 10415 + }, + { + "Code": 4400, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Charging-Per-IP-CAN-Session-Indicator", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 4401, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Access-Network-Info-Change", + "Type": "Grouped", + "Vendor": 10415 + }, + { + "Code": 4402, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Discoveree-UE-HPLMN-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 4403, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Discoveree-UE-VPLMN-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 4404, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Discoverer-UE-HPLMN-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 4405, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Discoverer-UE-VPLMN-Identifier", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 4406, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "3GPP-PS-Data-Off-Status-32.299", + "Type": "Enumerated", + "Vendor": 10415 + }, + { + "Code": 4407, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Unused-Quota-Timer", + "Type": "Unsigned32", + "Vendor": 10415 + }, + { + "Code": 4408, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Announcing-PLMN-ID", + "Type": "UTF8String", + "Vendor": 10415 + }, + { + "Code": 4409, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ProSe-UE-to-Network-Relay-UE-ID", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 4410, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "ProSe-Target-Layer-2-ID", + "Type": "OctetString", + "Vendor": 10415 + }, + { + "Code": 4411, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Relay-IP-address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 4412, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "Target-IP-Address", + "Type": "Address", + "Vendor": 10415 + }, + { + "Code": 4413, + "Flags": { + "Must": "VM", + "MustNot": "" + }, + "Name": "FE-Identifier-List", + "Type": "UTF8String", + "Vendor": 10415 + } + ], + "CommandRules": [ + { + "Command": "Credit-Control-Request", + "Content": [ + { + "AVP": "Credit-Management-Status", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Supported-Features", + "Vendor": 10415 + }, + { + "AVP": "TDF-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Network-Request-Support", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Packet-Filter-Information", + "Vendor": 10415 + }, + { + "AVP": "Packet-Filter-Operation", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Bearer-Identifier", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Bearer-Operation", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Dynamic-Address-Flag", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Dynamic-Address-Flag-Extension", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "PDN-Connection-Charging-ID", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Framed-IP-Address", + "Max": 1 + }, + { + "AVP": "IP-CAN-Type", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-RAT-Type", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "AN-Trusted", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "RAT-Type", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "QoS-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "QoS-Negotiation", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "QoS-Upgrade", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Default-EPS-Bearer-QoS", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Default-QoS-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "AN-GW-Address", + "Vendor": 10415, + "Max": 2 + }, + { + "AVP": "AN-GW-Status", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-SGSN-MCC-MNC", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-SGSN-Address", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-SGSN-IPv6-Address", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-GGSN-Address", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-GGSN-IPv6-Address", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-Selection-Mode", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "RAI", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-User-Location-Info", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Fixed-User-Location-Info", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "User-Location-Info-Time", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "User-CSG-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-MS-TimeZone", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "RAN-NAS-Release-Cause", + "Vendor": 10415 + }, + { + "AVP": "3GPP-Charging-Characteristics", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Called-Station-Id", + "Max": 1 + }, + { + "AVP": "PDN-Connection-ID", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Bearer-Usage", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Online", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Offline", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "TFT-Packet-Filter-Information", + "Vendor": 10415 + }, + { + "AVP": "Charging-Rule-Report", + "Vendor": 10415 + }, + { + "AVP": "Application-Detection-Information", + "Vendor": 10415 + }, + { + "AVP": "Event-Trigger", + "Vendor": 10415 + }, + { + "AVP": "Event-Report-Indication", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Access-Network-Charging-Address", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Access-Network-Charging-Identifier-Gx", + "Vendor": 10415 + }, + { + "AVP": "CoA-Information", + "Vendor": 10415 + }, + { + "AVP": "Usage-Monitoring-Information", + "Vendor": 10415 + }, + { + "AVP": "NBIFOM-Support", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "NBIFOM-Mode", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Default-Access", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Access-Availability-Change-Reason", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Routing-Rule-Install", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Routing-Rule-Remove", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "HeNB-Local-IP-Address", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "UE-Local-IP-Address", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "UDP-Source-Port", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "TCP-Source-Port", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Presence-Reporting-Area-Information", + "Vendor": 10415 + }, + { + "AVP": "3GPP-PS-Data-Off-Status", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Service-Information", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "AoC-Request-Type", + "Max": 1, + "Vendor": 10415 + } + + ] + }, + { + "Command": "Credit-Control-Answer", + "Content": [ + { + "AVP": "Experimental-Result", + "Max": 1 + }, + { + "AVP": "Supported-Features", + "Vendor": 10415 + }, + { + "AVP": "Bearer-Control-Mode", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Event-Trigger", + "Vendor": 10415 + }, + { + "AVP": "Event-Report-Indication", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Charging-Rule-Remove", + "Vendor": 10415 + }, + { + "AVP": "Charging-Rule-Install", + "Vendor": 10415 + }, + { + "AVP": "Charging-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Online", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Offline", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "QoS-Information", + "Vendor": 10415 + }, + { + "AVP": "Revalidation-Time", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Default-EPS-Bearer-QoS", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Default-QoS-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Bearer-Usage", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Usage-Monitoring-Information", + "Vendor": 10415 + }, + { + "AVP": "CSG-Information-Reporting", + "Vendor": 10415 + }, + { + "AVP": "User-CSG-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "PRA-Install", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "PRA-Remove", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Presence-Reporting-Area-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Session-Release-Cause", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "NBIFOM-Support", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "NBIFOM-Mode", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Default-Access", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "RAN-Rule-Support", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Routing-Rule-Report", + "Vendor": 10415 + }, + { + "AVP": "Conditional-Policy-Information", + "Vendor": 10415, + "Max": 4 + }, + { + "AVP": "Removal-Of-Access", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "IP-CAN-Type", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Error-Message", + "Max": 1 + }, + { + "AVP": "Error-Reporting-Host", + "Max": 1 + }, + { + "AVP": "Service-Information", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Low-Balance-Indication", + "Max": 1, + "Vendor": 10415 + }, + { + "AVP": "Remaining-Balance", + "Max": 1, + "Vendor": 10415 + } + ] + }, + { + "Command": "Re-Auth-Request", + "Content": [ + { + "AVP": "Session-Release-Cause", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Event-Trigger", + "Vendor": 10415, + }, + { + "AVP": "Event-Report-Indication", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Charging-Rule-Remove", + "Vendor": 10415 + }, + { + "AVP": "Charging-Rule-Install", + "Vendor": 10415 + }, + { + "AVP": "Default-EPS-Bearer-QoS", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "QoS-Information", + "Vendor": 10415 + }, + { + "AVP": "Default-QoS-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Revalidation-Time", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Usage-Monitoring-Information", + "Vendor": 10415 + }, + { + "AVP": "PCSCF-Restoration-Indication", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Conditional-Policy-Information", + "Vendor": 10415, + "Max": 4 + }, + { + "AVP": "Removal-Of-Access", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "IP-CAN-Type", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "PRA-Install", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "PRA-Remove", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Specific-Action", + "Vendor": 10415, + "Min": 1, + "Max": 1 + }, + { + "AVP": "Access-Network-Charging-Identifier", + "Vendor": 10415 + }, + { + "AVP": "Access-Network-Charging-Address", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "AN-GW-Address", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "AN-Trusted", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Flows", + "Vendor": 10415 + }, + { + "AVP": "Subscription-Id", + }, + { + "AVP": "Abort-Cause", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "IP-CAN-Type", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "NetLoc-Access-Support", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "RAT-Type", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Sponsored-Connectivity-Data", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-User-Location-Info", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "User-Location-Info-Time", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-MS-TimeZone", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "RAN-NAS-Release-Cause", + "Vendor": 10415 + }, + { + "AVP": "3GPP-SGSN-MCC-MNC", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "TCP-Source-Port", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "UDP-Source-Port", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "UE-Local-IP-Address", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Class", + } + ] + }, + { + "Command": "Re-Auth-Answer", + "Content": [ + { + "AVP": "Experimental-Result", + "Max": 1 + }, + { + "AVP": "IP-CAN-Type", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "RAT-Type", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "AN-Trusted", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "AN-GW-Address", + "Vendor": 10415, + "Max": 2 + }, + { + "AVP": "3GPP-SGSN-MCC-MNC", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-SGSN-Address", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-SGSN-IPv6-Address", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "RAI", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-User-Location-Info", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "User-Location-Info-Time", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "NetLoc-Access-Support", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "User-CSG-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "3GPP-MS-TimeZone", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Default-QoS-Information", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Charging-Rule-Report", + "Vendor": 10415 + }, + { + "AVP": "Media-Component-Description", + "Vendor": 10415 + }, + { + "AVP": "Service-URN", + "Vendor": 10415, + "Max": 1 + }, + { + "AVP": "Class", + }, + + ] + }, + ], + "Vendors": [ + { + "Code": 5535, + "Name": "3GPP2" + }, + { + "Code": 10415, + "Name": "3GPP" + } + ] +} diff -r 229ecec59ff5 -r 73b9f2aefb75 contrib/dict_json/dictionary_dcca_3gpp_sy.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/dict_json/dictionary_dcca_3gpp_sy.json Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,377 @@ +{ + "AVPRules" : [ + { + "AVP" : "Policy-Counter-Status-Report", + "Content" : [ + { + "AVP" : "Policy-Counter-Identifier", + "Vendor" : 10415 + }, + { + "AVP" : "Policy-Counter-Status", + "Vendor" : 10415 + } + ], + "Vendor" : 10415 + } + ], + "AVPs" : [ + { + "Code" : 2901, + "Flags" : { + "Must" : "VM", + "MustNot" : "" + }, + "Name" : "Policy-Counter-Identifier", + "Type" : "UTF8String", + "Vendor" : 10415 + }, + { + "Code" : 2902, + "Flags" : { + "Must" : "VM", + "MustNot" : "" + }, + "Name" : "Policy-Counter-Status", + "Type" : "UTF8String", + "Vendor" : 10415 + }, + { + "Code" : 2903, + "Flags" : { + "Must" : "VM", + "MustNot" : "" + }, + "Name" : "Policy-Counter-Status-Report", + "Type" : "Grouped", + "Vendor" : 10415 + }, + { + "Code" : 2904, + "EnumValues" : [ + { + "Code" : 0, + "Name" : "INITIAL_REQUEST" + }, + { + "Code" : 1, + "Name" : "INTERMEDIATE_REQUEST" + } + ], + "Flags" : { + "Must" : "VM", + "MustNot" : "" + }, + "Name" : "SL-Request-Type", + "Type" : "Enumerated", + "Vendor" : 10415 + } + ], + "Applications" : [ + { + "Code" : 16777302, + "Name" : "Sy" + } + ], + "CommandRules" : [ + { + "Command" : "Spending-Limit-Request", + "Content" : [ + { + "AVP" : "Auth-Application-Id", + "Max" : 1, + "Min" : 1 + }, + { + "AVP" : "Session-Id", + "First" : true, + "Max" : 1, + "Min" : 1 + }, + { + "AVP" : "Origin-Host", + "Max" : 1, + "Min" : 1 + }, + { + "AVP" : "Origin-State-Id", + "Max" : 1, + "Min" : 0 + }, + { + "AVP" : "Route-Record", + "Min" : 0 + }, + { + "AVP" : "Destination-Realm", + "Max" : 1, + "Min" : 1 + }, + { + "AVP" : "Proxy-Info", + "Min" : 0 + }, + { + "AVP" : "Destination-Host", + "Max" : 1, + "Min" : 0 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1, + "Min" : 1 + }, + { + "AVP" : "Subscription-Id", + "Min" : 0 + }, + { + "AVP" : "Policy-Counter-Identifier", + "Min" : 0, + "Vendor" : 10415 + }, + { + "AVP" : "SL-Request-Type", + "Max" : 1, + "Min" : 1, + "Vendor" : 10415 + } + ] + }, + { + "Command" : "Spending-Limit-Answer", + "Content" : [ + { + "AVP" : "Auth-Application-Id", + "Max" : 1, + "Min" : 1 + }, + { + "AVP" : "Redirect-Host-Usage", + "Max" : 1, + "Min" : 0 + }, + { + "AVP" : "Redirect-Max-Cache-Time", + "Max" : 1, + "Min" : 0 + }, + { + "AVP" : "Session-Id", + "First" : true, + "Max" : 1, + "Min" : 1 + }, + { + "AVP" : "Origin-Host", + "Max" : 1, + "Min" : 1 + }, + { + "AVP" : "Result-Code", + "Max" : 1, + "Min" : 0 + }, + { + "AVP" : "Origin-State-Id", + "Max" : 1, + "Min" : 0 + }, + { + "AVP" : "Failed-AVP", + "Min" : 0 + }, + { + "AVP" : "Error-Message", + "Max" : 1, + "Min" : 0 + }, + { + "AVP" : "Proxy-Info", + "Min" : 0 + }, + { + "AVP" : "Redirect-Host", + "Min" : 0 + }, + { + "AVP" : "Error-Reporting-Host", + "Max" : 1, + "Min" : 0 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1, + "Min" : 1 + }, + { + "AVP" : "Experimental-Result", + "Max" : 1, + "Min" : 0 + }, + { + "AVP" : "Policy-Counter-Status-Report", + "Min" : 0, + "Vendor" : 10415 + } + ] + }, + { + "Command" : "Spending-Status-Notification-Request", + "Content" : [ + { + "AVP" : "Auth-Application-Id", + "Max" : 1, + "Min" : 1 + }, + { + "AVP" : "Session-Id", + "First" : true, + "Max" : 1, + "Min" : 1 + }, + { + "AVP" : "Origin-Host", + "Max" : 1, + "Min" : 1 + }, + { + "AVP" : "Origin-State-Id", + "Max" : 1, + "Min" : 0 + }, + { + "AVP" : "Route-Record", + "Min" : 0 + }, + { + "AVP" : "Destination-Realm", + "Max" : 1, + "Min" : 1 + }, + { + "AVP" : "Proxy-Info", + "Min" : 0 + }, + { + "AVP" : "Destination-Host", + "Max" : 1, + "Min" : 0 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1, + "Min" : 1 + }, + { + "AVP" : "Policy-Counter-Status-Report", + "Min" : 0, + "Vendor" : 10415 + } + ] + }, + { + "Command" : "Spending-Status-Notification-Answer", + "Content" : [ + { + "AVP" : "Redirect-Host-Usage", + "Max" : 1, + "Min" : 0 + }, + { + "AVP" : "Redirect-Max-Cache-Time", + "Max" : 1, + "Min" : 0 + }, + { + "AVP" : "Session-Id", + "First" : true, + "Max" : 1, + "Min" : 1 + }, + { + "AVP" : "Origin-Host", + "Max" : 1, + "Min" : 1 + }, + { + "AVP" : "Result-Code", + "Max" : 1, + "Min" : 0 + }, + { + "AVP" : "Origin-State-Id", + "Max" : 1, + "Min" : 0 + }, + { + "AVP" : "Failed-AVP", + "Min" : 0 + }, + { + "AVP" : "Error-Message", + "Max" : 1, + "Min" : 0 + }, + { + "AVP" : "Proxy-Info", + "Min" : 0 + }, + { + "AVP" : "Redirect-Host", + "Min" : 0 + }, + { + "AVP" : "Error-Reporting-Host", + "Max" : 1, + "Min" : 0 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1, + "Min" : 1 + }, + { + "AVP" : "Experimental-Result", + "Max" : 1, + "Min" : 0 + } + ] + } + ], + "Commands" : [ + { + "Code" : 8388635, + "Flags" : { + "Must" : "R", + "MustNot" : "" + }, + "Name" : "Spending-Limit-Request" + }, + { + "Code" : 8388635, + "Flags" : { + "Must" : "", + "MustNot" : "R" + }, + "Name" : "Spending-Limit-Answer" + }, + { + "Code" : 8388636, + "Flags" : { + "Must" : "R", + "MustNot" : "" + }, + "Name" : "Spending-Status-Notification-Request" + }, + { + "Code" : 8388636, + "Flags" : { + "Must" : "", + "MustNot" : "R" + }, + "Name" : "Spending-Status-Notification-Answer" + } + ] +} + diff -r 229ecec59ff5 -r 73b9f2aefb75 contrib/dict_json/dictionary_freediameter_base.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/dict_json/dictionary_freediameter_base.json Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,1632 @@ +{ + "AVPRules" : [ + { + "AVP" : "Vendor-Specific-Application-Id", + "Content" : [ + { + "AVP" : "Auth-Application-Id", + "Max" : 1 + }, + { + "AVP" : "Acct-Application-Id", + "Max" : 1 + }, + { + "AVP" : "Vendor-Id" + } + ] + }, + { + "AVP" : "Proxy-Info", + "Content" : [ + { + "AVP" : "Proxy-State", + "Max" : 1 + }, + { + "AVP" : "Proxy-Host", + "Max" : 1 + } + ] + } + ], + "AVPs" : [ + { + "Code" : 1, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "User-Name", + "Type" : "UTF8String" + }, + { + "Code" : 25, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Class", + "Type" : "OctetString" + }, + { + "Code" : 27, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Session-Timeout", + "Type" : "Unsigned32" + }, + { + "Code" : 33, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Proxy-State", + "Type" : "OctetString" + }, + { + "Code" : 44, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Acct-Session-Id", + "Type" : "OctetString" + }, + { + "Code" : 50, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Acct-Multi-Session-Id", + "Type" : "UTF8String" + }, + { + "Code" : 55, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Event-Timestamp", + "Type" : "Time" + }, + { + "Code" : 85, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Acct-Interim-Interval", + "Type" : "Unsigned32" + }, + { + "Code" : 257, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Host-IP-Address", + "Type" : "Address" + }, + { + "Code" : 258, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Auth-Application-Id", + "Type" : "Unsigned32" + }, + { + "Code" : 259, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Acct-Application-Id", + "Type" : "Unsigned32" + }, + { + "Code" : 260, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Vendor-Specific-Application-Id", + "Type" : "Grouped" + }, + { + "Code" : 261, + "EnumValues" : [ + { + "Code" : 5, + "Name" : "ALL_HOST" + }, + { + "Code" : 6, + "Name" : "ALL_USER" + }, + { + "Code" : 2, + "Name" : "ALL_REALM" + }, + { + "Code" : 0, + "Name" : "DONT_CACHE" + }, + { + "Code" : 1, + "Name" : "ALL_SESSION" + }, + { + "Code" : 4, + "Name" : "ALL_APPLICATION" + }, + { + "Code" : 3, + "Name" : "REALM_AND_APPLICATION" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Redirect-Host-Usage", + "Type" : "Enumerated" + }, + { + "Code" : 262, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Redirect-Max-Cache-Time", + "Type" : "Unsigned32" + }, + { + "Code" : 263, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Session-Id", + "Type" : "UTF8String" + }, + { + "Code" : 264, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Origin-Host", + "Type" : "DiameterIdentity" + }, + { + "Code" : 265, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Supported-Vendor-Id", + "Type" : "Unsigned32" + }, + { + "Code" : 266, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Vendor-Id", + "Type" : "Unsigned32" + }, + { + "Code" : 267, + "Flags" : { + "Must" : "", + "MustNot" : "VM" + }, + "Name" : "Firmware-Revision", + "Type" : "Unsigned32" + }, + { + "Code" : 268, + "EnumValues" : [ + { + "Code" : 4003, + "Name" : "ELECTION_LOST" + }, + { + "Code" : 2001, + "Name" : "DIAMETER_SUCCESS" + }, + { + "Code" : 3004, + "Name" : "DIAMETER_TOO_BUSY" + }, + { + "Code" : 5005, + "Name" : "DIAMETER_MISSING_AVP" + }, + { + "Code" : 4002, + "Name" : "DIAMETER_OUT_OF_SPACE" + }, + { + "Code" : 3010, + "Name" : "DIAMETER_UNKNOWN_PEER" + }, + { + "Code" : 3005, + "Name" : "DIAMETER_LOOP_DETECTED" + }, + { + "Code" : 5008, + "Name" : "DIAMETER_AVP_NOT_ALLOWED" + }, + { + "Code" : 5001, + "Name" : "DIAMETER_AVP_UNSUPPORTED" + }, + { + "Code" : 2002, + "Name" : "DIAMETER_LIMITED_SUCCESS" + }, + { + "Code" : 3009, + "Name" : "DIAMETER_INVALID_AVP_BITS" + }, + { + "Code" : 3008, + "Name" : "DIAMETER_INVALID_HDR_BITS" + }, + { + "Code" : 1001, + "Name" : "DIAMETER_MULTI_ROUND_AUTH" + }, + { + "Code" : 3003, + "Name" : "DIAMETER_REALM_NOT_SERVED" + }, + { + "Code" : 5012, + "Name" : "DIAMETER_UNABLE_TO_COMPLY" + }, + { + "Code" : 5004, + "Name" : "DIAMETER_INVALID_AVP_VALUE" + }, + { + "Code" : 3002, + "Name" : "DIAMETER_UNABLE_TO_DELIVER" + }, + { + "Code" : 5007, + "Name" : "DIAMETER_CONTRADICTING_AVPS" + }, + { + "Code" : 5014, + "Name" : "DIAMETER_INVALID_AVP_LENGTH" + }, + { + "Code" : 5017, + "Name" : "DIAMETER_NO_COMMON_SECURITY" + }, + { + "Code" : 5006, + "Name" : "DIAMETER_RESOURCES_EXCEEDED" + }, + { + "Code" : 5002, + "Name" : "DIAMETER_UNKNOWN_SESSION_ID" + }, + { + "Code" : 3001, + "Name" : "DIAMETER_COMMAND_UNSUPPORTED" + }, + { + "Code" : 3006, + "Name" : "DIAMETER_REDIRECT_INDICATION" + }, + { + "Code" : 5011, + "Name" : "DIAMETER_UNSUPPORTED_VERSION" + }, + { + "Code" : 5016, + "Name" : "DIAMETER_INVALID_AVP_BIT_COMBO" + }, + { + "Code" : 5013, + "Name" : "DIAMETER_INVALID_BIT_IN_HEADER" + }, + { + "Code" : 5010, + "Name" : "DIAMETER_NO_COMMON_APPLICATION" + }, + { + "Code" : 5003, + "Name" : "DIAMETER_AUTHORIZATION_REJECTED" + }, + { + "Code" : 5015, + "Name" : "DIAMETER_INVALID_MESSAGE_LENGTH" + }, + { + "Code" : 3007, + "Name" : "DIAMETER_APPLICATION_UNSUPPORTED" + }, + { + "Code" : 4001, + "Name" : "DIAMETER_AUTHENTICATION_REJECTED" + }, + { + "Code" : 5009, + "Name" : "DIAMETER_AVP_OCCURS_TOO_MANY_TIMES" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Result-Code", + "Type" : "Unsigned32" + }, + { + "Code" : 269, + "Flags" : { + "Must" : "", + "MustNot" : "VM" + }, + "Name" : "Product-Name", + "Type" : "UTF8String" + }, + { + "Code" : 270, + "EnumValues" : [ + { + "Code" : 2, + "Name" : "STR" + }, + { + "Code" : 1, + "Name" : "RE_AUTH" + }, + { + "Code" : 4, + "Name" : "ACCOUNTING" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Session-Binding", + "Type" : "Unsigned32" + }, + { + "Code" : 271, + "EnumValues" : [ + { + "Code" : 1, + "Name" : "TRY_AGAIN" + }, + { + "Code" : 2, + "Name" : "ALLOW_SERVICE" + }, + { + "Code" : 0, + "Name" : "REFUSE_SERVICE" + }, + { + "Code" : 3, + "Name" : "TRY_AGAIN_ALLOW_SERVICE" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Session-Server-Failover", + "Type" : "Enumerated" + }, + { + "Code" : 272, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Multi-Round-Time-Out", + "Type" : "Unsigned32" + }, + { + "Code" : 273, + "EnumValues" : [ + { + "Code" : 1, + "Name" : "BUSY" + }, + { + "Code" : 0, + "Name" : "REBOOTING" + }, + { + "Code" : 2, + "Name" : "DO_NOT_WANT_TO_TALK_TO_YOU" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Disconnect-Cause", + "Type" : "Enumerated" + }, + { + "Code" : 274, + "EnumValues" : [ + { + "Code" : 2, + "Name" : "AUTHORIZE_ONLY" + }, + { + "Code" : 1, + "Name" : "AUTHENTICATE_ONLY" + }, + { + "Code" : 3, + "Name" : "AUTHORIZE_AUTHENTICATE" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Auth-Request-Type", + "Type" : "Enumerated" + }, + { + "Code" : 276, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Auth-Grace-Period", + "Type" : "Unsigned32" + }, + { + "Code" : 277, + "EnumValues" : [ + { + "Code" : 0, + "Name" : "STATE_MAINTAINED" + }, + { + "Code" : 1, + "Name" : "NO_STATE_MAINTAINED" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Auth-Session-State", + "Type" : "Enumerated" + }, + { + "Code" : 278, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Origin-State-Id", + "Type" : "Unsigned32" + }, + { + "Code" : 279, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Failed-AVP", + "Type" : "Grouped" + }, + { + "Code" : 280, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Proxy-Host", + "Type" : "DiameterIdentity" + }, + { + "Code" : 281, + "Flags" : { + "Must" : "", + "MustNot" : "VM" + }, + "Name" : "Error-Message", + "Type" : "UTF8String" + }, + { + "Code" : 282, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Route-Record", + "Type" : "DiameterIdentity" + }, + { + "Code" : 283, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Destination-Realm", + "Type" : "DiameterIdentity" + }, + { + "Code" : 284, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Proxy-Info", + "Type" : "Grouped" + }, + { + "Code" : 285, + "EnumValues" : [ + { + "Code" : 0, + "Name" : "AUTHORIZE_ONLY" + }, + { + "Code" : 1, + "Name" : "AUTHORIZE_AUTHENTICATE" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Re-Auth-Request-Type", + "Type" : "Enumerated" + }, + { + "Code" : 287, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Accounting-Sub-Session-Id", + "Type" : "Unsigned64" + }, + { + "Code" : 291, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Authorization-Lifetime", + "Type" : "Unsigned32" + }, + { + "Code" : 292, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Redirect-Host", + "Type" : "DiameterURI" + }, + { + "Code" : 293, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Destination-Host", + "Type" : "DiameterIdentity" + }, + { + "Code" : 294, + "Flags" : { + "Must" : "", + "MustNot" : "VM" + }, + "Name" : "Error-Reporting-Host", + "Type" : "DiameterIdentity" + }, + { + "Code" : 295, + "EnumValues" : [ + { + "Code" : 1, + "Name" : "DIAMETER_LOGOUT" + }, + { + "Code" : 3, + "Name" : "DIAMETER_BAD_ANSWER" + }, + { + "Code" : 7, + "Name" : "DIAMETER_USER_MOVED" + }, + { + "Code" : 5, + "Name" : "DIAMETER_LINK_BROKEN" + }, + { + "Code" : 6, + "Name" : "DIAMETER_AUTH_EXPIRED" + }, + { + "Code" : 4, + "Name" : "DIAMETER_ADMINISTRATIVE" + }, + { + "Code" : 8, + "Name" : "DIAMETER_SESSION_TIMEOUT" + }, + { + "Code" : 2, + "Name" : "DIAMETER_SERVICE_NOT_PROVIDED" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Termination-Cause", + "Type" : "Enumerated" + }, + { + "Code" : 296, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Origin-Realm", + "Type" : "DiameterIdentity" + }, + { + "Code" : 297, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Experimental-Result", + "Type" : "Grouped" + }, + { + "Code" : 298, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Experimental-Result-Code", + "Type" : "Unsigned32" + }, + { + "Code" : 299, + "EnumValues" : [ + { + "Code" : 1, + "Name" : "TLS" + }, + { + "Code" : 0, + "Name" : "NO_INBAND_SECURITY" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Inband-Security-Id", + "Type" : "Unsigned32" + }, + { + "Code" : 480, + "EnumValues" : [ + { + "Code" : 4, + "Name" : "STOP_RECORD" + }, + { + "Code" : 1, + "Name" : "EVENT_RECORD" + }, + { + "Code" : 2, + "Name" : "START_RECORD" + }, + { + "Code" : 3, + "Name" : "INTERIM_RECORD" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Accounting-Record-Type", + "Type" : "Enumerated" + }, + { + "Code" : 483, + "EnumValues" : [ + { + "Code" : 3, + "Name" : "GRANT_AND_LOSE" + }, + { + "Code" : 2, + "Name" : "GRANT_AND_STORE" + }, + { + "Code" : 1, + "Name" : "DELIVER_AND_GRANT" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Accounting-Realtime-Required", + "Type" : "Enumerated" + }, + { + "Code" : 485, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Accounting-Record-Number", + "Type" : "Unsigned32" + } + ], + "Applications" : [ + { + "Code" : 0, + "Name" : "Diameter Common Messages" + }, + { + "Code" : 3, + "Name" : "Diameter Base Accounting" + }, + { + "Code" : 4294967295, + "Name" : "Relay" + } + ], + "CommandRules" : [ + { + "Command" : "Capabilities-Exchange-Request", + "Content" : [ + { + "AVP" : "Host-IP-Address" + }, + { + "AVP" : "Auth-Application-Id" + }, + { + "AVP" : "Acct-Application-Id" + }, + { + "AVP" : "Vendor-Specific-Application-Id" + }, + { + "AVP" : "Origin-Host", + "Max" : 1 + }, + { + "AVP" : "Supported-Vendor-Id" + }, + { + "AVP" : "Vendor-Id", + "Max" : 1 + }, + { + "AVP" : "Firmware-Revision", + "Max" : 1 + }, + { + "AVP" : "Product-Name", + "Max" : 1 + }, + { + "AVP" : "Origin-State-Id", + "Max" : 1 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1 + }, + { + "AVP" : "Inband-Security-Id" + } + ] + }, + { + "Command" : "Capabilities-Exchange-Answer", + "Content" : [ + { + "AVP" : "Host-IP-Address" + }, + { + "AVP" : "Auth-Application-Id" + }, + { + "AVP" : "Acct-Application-Id" + }, + { + "AVP" : "Vendor-Specific-Application-Id" + }, + { + "AVP" : "Origin-Host", + "Max" : 1 + }, + { + "AVP" : "Supported-Vendor-Id" + }, + { + "AVP" : "Vendor-Id", + "Max" : 1 + }, + { + "AVP" : "Firmware-Revision", + "Max" : 1 + }, + { + "AVP" : "Result-Code", + "Max" : 1 + }, + { + "AVP" : "Product-Name", + "Max" : 1 + }, + { + "AVP" : "Origin-State-Id", + "Max" : 1 + }, + { + "AVP" : "Failed-AVP", + "Max" : 1 + }, + { + "AVP" : "Error-Message", + "Max" : 1 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1 + }, + { + "AVP" : "Inband-Security-Id" + } + ] + }, + { + "Command" : "Re-Auth-Request", + "Content" : [ + { + "AVP" : "User-Name", + "Max" : 1 + }, + { + "AVP" : "Auth-Application-Id", + "Max" : 1 + }, + { + "AVP" : "Session-Id", + "First" : true, + "Max" : 1 + }, + { + "AVP" : "Origin-Host", + "Max" : 1 + }, + { + "AVP" : "Origin-State-Id", + "Max" : 1 + }, + { + "AVP" : "Route-Record" + }, + { + "AVP" : "Destination-Realm", + "Max" : 1 + }, + { + "AVP" : "Proxy-Info" + }, + { + "AVP" : "Re-Auth-Request-Type", + "Max" : 1 + }, + { + "AVP" : "Destination-Host", + "Max" : 1 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1 + } + ] + }, + { + "Command" : "Re-Auth-Answer", + "Content" : [ + { + "AVP" : "User-Name", + "Max" : 1 + }, + { + "AVP" : "Redirect-Host-Usage", + "Max" : 1 + }, + { + "AVP" : "Redirect-Max-Cache-Time", + "Max" : 1 + }, + { + "AVP" : "Session-Id", + "First" : true, + "Max" : 1 + }, + { + "AVP" : "Origin-Host", + "Max" : 1 + }, + { + "AVP" : "Result-Code", + "Max" : 1 + }, + { + "AVP" : "Origin-State-Id", + "Max" : 1 + }, + { + "AVP" : "Failed-AVP", + "Max" : 1 + }, + { + "AVP" : "Error-Message", + "Max" : 1 + }, + { + "AVP" : "Proxy-Info" + }, + { + "AVP" : "Redirect-Host" + }, + { + "AVP" : "Error-Reporting-Host", + "Max" : 1 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1 + } + ] + }, + { + "Command" : "Accounting-Request", + "Content" : [ + { + "AVP" : "User-Name", + "Max" : 1 + }, + { + "AVP" : "Acct-Session-Id", + "Max" : 1 + }, + { + "AVP" : "Acct-Multi-Session-Id", + "Max" : 1 + }, + { + "AVP" : "Event-Timestamp", + "Max" : 1 + }, + { + "AVP" : "Acct-Interim-Interval", + "Max" : 1 + }, + { + "AVP" : "Acct-Application-Id", + "Max" : 1 + }, + { + "AVP" : "Vendor-Specific-Application-Id", + "Max" : 1 + }, + { + "AVP" : "Session-Id", + "First" : true, + "Max" : 1 + }, + { + "AVP" : "Origin-Host", + "Max" : 1 + }, + { + "AVP" : "Origin-State-Id", + "Max" : 1 + }, + { + "AVP" : "Route-Record" + }, + { + "AVP" : "Destination-Realm", + "Max" : 1 + }, + { + "AVP" : "Proxy-Info" + }, + { + "AVP" : "Accounting-Sub-Session-Id", + "Max" : 1 + }, + { + "AVP" : "Destination-Host", + "Max" : 1 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1 + }, + { + "AVP" : "Accounting-Record-Type", + "Max" : 1 + }, + { + "AVP" : "Accounting-Realtime-Required", + "Max" : 1 + }, + { + "AVP" : "Accounting-Record-Number", + "Max" : 1 + } + ] + }, + { + "Command" : "Accounting-Answer", + "Content" : [ + { + "AVP" : "User-Name", + "Max" : 1 + }, + { + "AVP" : "Acct-Session-Id", + "Max" : 1 + }, + { + "AVP" : "Acct-Multi-Session-Id", + "Max" : 1 + }, + { + "AVP" : "Event-Timestamp", + "Max" : 1 + }, + { + "AVP" : "Acct-Interim-Interval", + "Max" : 1 + }, + { + "AVP" : "Acct-Application-Id", + "Max" : 1 + }, + { + "AVP" : "Vendor-Specific-Application-Id", + "Max" : 1 + }, + { + "AVP" : "Session-Id", + "First" : true, + "Max" : 1 + }, + { + "AVP" : "Origin-Host", + "Max" : 1 + }, + { + "AVP" : "Result-Code", + "Max" : 1 + }, + { + "AVP" : "Origin-State-Id", + "Max" : 1 + }, + { + "AVP" : "Failed-AVP", + "Max" : 1 + }, + { + "AVP" : "Error-Message", + "Max" : 1 + }, + { + "AVP" : "Proxy-Info" + }, + { + "AVP" : "Accounting-Sub-Session-Id", + "Max" : 1 + }, + { + "AVP" : "Error-Reporting-Host", + "Max" : 1 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1 + }, + { + "AVP" : "Accounting-Record-Type", + "Max" : 1 + }, + { + "AVP" : "Accounting-Realtime-Required", + "Max" : 1 + }, + { + "AVP" : "Accounting-Record-Number", + "Max" : 1 + } + ] + }, + { + "Command" : "Abort-Session-Request", + "Content" : [ + { + "AVP" : "User-Name", + "Max" : 1 + }, + { + "AVP" : "Auth-Application-Id", + "Max" : 1 + }, + { + "AVP" : "Session-Id", + "First" : true, + "Max" : 1 + }, + { + "AVP" : "Origin-Host", + "Max" : 1 + }, + { + "AVP" : "Origin-State-Id", + "Max" : 1 + }, + { + "AVP" : "Route-Record" + }, + { + "AVP" : "Destination-Realm", + "Max" : 1 + }, + { + "AVP" : "Proxy-Info" + }, + { + "AVP" : "Destination-Host", + "Max" : 1 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1 + } + ] + }, + { + "Command" : "Abort-Session-Answer", + "Content" : [ + { + "AVP" : "User-Name", + "Max" : 1 + }, + { + "AVP" : "Redirect-Host-Usage", + "Max" : 1 + }, + { + "AVP" : "Redirect-Max-Cache-Time", + "Max" : 1 + }, + { + "AVP" : "Session-Id", + "First" : true, + "Max" : 1 + }, + { + "AVP" : "Origin-Host", + "Max" : 1 + }, + { + "AVP" : "Result-Code", + "Max" : 1 + }, + { + "AVP" : "Origin-State-Id", + "Max" : 1 + }, + { + "AVP" : "Failed-AVP", + "Max" : 1 + }, + { + "AVP" : "Error-Message", + "Max" : 1 + }, + { + "AVP" : "Proxy-Info" + }, + { + "AVP" : "Redirect-Host" + }, + { + "AVP" : "Error-Reporting-Host", + "Max" : 1 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1 + } + ] + }, + { + "Command" : "Session-Termination-Request", + "Content" : [ + { + "AVP" : "User-Name", + "Max" : 1 + }, + { + "AVP" : "Class" + }, + { + "AVP" : "Auth-Application-Id", + "Max" : 1 + }, + { + "AVP" : "Session-Id", + "First" : true, + "Max" : 1 + }, + { + "AVP" : "Origin-Host", + "Max" : 1 + }, + { + "AVP" : "Origin-State-Id", + "Max" : 1 + }, + { + "AVP" : "Route-Record" + }, + { + "AVP" : "Destination-Realm", + "Max" : 1 + }, + { + "AVP" : "Proxy-Info" + }, + { + "AVP" : "Destination-Host", + "Max" : 1 + }, + { + "AVP" : "Termination-Cause", + "Max" : 1 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1 + } + ] + }, + { + "Command" : "Session-Termination-Answer", + "Content" : [ + { + "AVP" : "User-Name", + "Max" : 1 + }, + { + "AVP" : "Class" + }, + { + "AVP" : "Redirect-Host-Usage", + "Max" : 1 + }, + { + "AVP" : "Redirect-Max-Cache-Time", + "Max" : 1 + }, + { + "AVP" : "Session-Id", + "First" : true, + "Max" : 1 + }, + { + "AVP" : "Origin-Host", + "Max" : 1 + }, + { + "AVP" : "Result-Code", + "Max" : 1 + }, + { + "AVP" : "Origin-State-Id", + "Max" : 1 + }, + { + "AVP" : "Failed-AVP", + "Max" : 1 + }, + { + "AVP" : "Error-Message", + "Max" : 1 + }, + { + "AVP" : "Proxy-Info" + }, + { + "AVP" : "Redirect-Host" + }, + { + "AVP" : "Error-Reporting-Host", + "Max" : 1 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1 + } + ] + }, + { + "Command" : "Device-Watchdog-Request", + "Content" : [ + { + "AVP" : "Origin-Host", + "Max" : 1 + }, + { + "AVP" : "Origin-State-Id", + "Max" : 1 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1 + } + ] + }, + { + "Command" : "Device-Watchdog-Answer", + "Content" : [ + { + "AVP" : "Origin-Host", + "Max" : 1 + }, + { + "AVP" : "Result-Code", + "Max" : 1 + }, + { + "AVP" : "Origin-State-Id", + "Max" : 1 + }, + { + "AVP" : "Failed-AVP", + "Max" : 1 + }, + { + "AVP" : "Error-Message", + "Max" : 1 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1 + } + ] + }, + { + "Command" : "Disconnect-Peer-Request", + "Content" : [ + { + "AVP" : "Origin-Host", + "Max" : 1 + }, + { + "AVP" : "Disconnect-Cause", + "Max" : 1 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1 + } + ] + }, + { + "Command" : "Disconnect-Peer-Answer", + "Content" : [ + { + "AVP" : "Origin-Host", + "Max" : 1 + }, + { + "AVP" : "Result-Code", + "Max" : 1 + }, + { + "AVP" : "Failed-AVP", + "Max" : 1 + }, + { + "AVP" : "Error-Message", + "Max" : 1 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1 + } + ] + } + ], + "Commands" : [ + { + "Code" : 257, + "Flags" : { + "Must" : "R", + "MustNot" : "PET" + }, + "Name" : "Capabilities-Exchange-Request" + }, + { + "Code" : 257, + "Flags" : { + "Must" : "", + "MustNot" : "RPT" + }, + "Name" : "Capabilities-Exchange-Answer" + }, + { + "Code" : 258, + "Flags" : { + "Must" : "RP", + "MustNot" : "E" + }, + "Name" : "Re-Auth-Request" + }, + { + "Code" : 258, + "Flags" : { + "Must" : "P", + "MustNot" : "R" + }, + "Name" : "Re-Auth-Answer" + }, + { + "Code" : 271, + "Flags" : { + "Must" : "RP", + "MustNot" : "E" + }, + "Name" : "Accounting-Request" + }, + { + "Code" : 271, + "Flags" : { + "Must" : "P", + "MustNot" : "R" + }, + "Name" : "Accounting-Answer" + }, + { + "Code" : 274, + "Flags" : { + "Must" : "RP", + "MustNot" : "E" + }, + "Name" : "Abort-Session-Request" + }, + { + "Code" : 274, + "Flags" : { + "Must" : "P", + "MustNot" : "R" + }, + "Name" : "Abort-Session-Answer" + }, + { + "Code" : 275, + "Flags" : { + "Must" : "RP", + "MustNot" : "E" + }, + "Name" : "Session-Termination-Request" + }, + { + "Code" : 275, + "Flags" : { + "Must" : "P", + "MustNot" : "R" + }, + "Name" : "Session-Termination-Answer" + }, + { + "Code" : 280, + "Flags" : { + "Must" : "R", + "MustNot" : "PET" + }, + "Name" : "Device-Watchdog-Request" + }, + { + "Code" : 280, + "Flags" : { + "Must" : "", + "MustNot" : "RPT" + }, + "Name" : "Device-Watchdog-Answer" + }, + { + "Code" : 282, + "Flags" : { + "Must" : "R", + "MustNot" : "PET" + }, + "Name" : "Disconnect-Peer-Request" + }, + { + "Code" : 282, + "Flags" : { + "Must" : "", + "MustNot" : "RPT" + }, + "Name" : "Disconnect-Peer-Answer" + } + ], + "Types" : [ + { + "Base" : "OctetString", + "Name" : "Address" + }, + { + "Base" : "OctetString", + "Name" : "DiameterIdentity" + }, + { + "Base" : "OctetString", + "Name" : "DiameterURI" + }, + { + "Base" : "OctetString", + "Name" : "IPFilterRule" + }, + { + "Base" : "OctetString", + "Name" : "Time" + }, + { + "Base" : "OctetString", + "Name" : "UTF8String" + } + ], + "Vendors" : [ + { + "Code" : 0, + "Name" : "(no vendor)" + } + ] +} + diff -r 229ecec59ff5 -r 73b9f2aefb75 contrib/dict_json/dictionary_nasreq.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/dict_json/dictionary_nasreq.json Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,2522 @@ +{ + "AVPRules" : [ + { + "AVP" : "Tunneling", + "Content" : [ + { + "AVP" : "Tunnel-Type", + "Max" : 1 + }, + { + "AVP" : "Tunnel-Medium-Type", + "Max" : 1 + }, + { + "AVP" : "Tunnel-Client-Endpoint", + "Max" : 1 + }, + { + "AVP" : "Tunnel-Server-Endpoint", + "Max" : 1 + }, + { + "AVP" : "Tunnel-Password", + "Max" : 1 + }, + { + "AVP" : "Tunnel-Private-Group-Id", + "Max" : 1 + }, + { + "AVP" : "Tunnel-Assignment-Id", + "Max" : 1 + }, + { + "AVP" : "Tunnel-Preference", + "Max" : 1 + }, + { + "AVP" : "Tunnel-Client-Auth-Id", + "Max" : 1 + }, + { + "AVP" : "Tunnel-Server-Auth-Id", + "Max" : 1 + } + ] + }, + { + "AVP" : "CHAP-Auth", + "Content" : [ + { + "AVP" : "CHAP-Algorithm", + "Max" : 1 + }, + { + "AVP" : "CHAP-Ident", + "Max" : 1 + }, + { + "AVP" : "CHAP-Response", + "Max" : 1 + } + ] + } + ], + "AVPs" : [ + { + "Code" : 2, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "User-Password", + "Type" : "OctetString" + }, + { + "Code" : 4, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "NAS-IP-Address", + "Type" : "OctetString" + }, + { + "Code" : 5, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "NAS-Port", + "Type" : "Unsigned32" + }, + { + "Code" : 6, + "EnumValues" : [ + { + "Code" : 1, + "Name" : "Login" + }, + { + "Code" : 2, + "Name" : "Framed" + }, + { + "Code" : 5, + "Name" : "Outbound" + }, + { + "Code" : 10, + "Name" : "Call Check" + }, + { + "Code" : 7, + "Name" : "NAS Prompt" + }, + { + "Code" : 13, + "Name" : "Fax [Chiba]" + }, + { + "Code" : 12, + "Name" : "Voice [Chiba]" + }, + { + "Code" : 6, + "Name" : "Administrative" + }, + { + "Code" : 3, + "Name" : "Callback Login" + }, + { + "Code" : 4, + "Name" : "Callback Framed" + }, + { + "Code" : 8, + "Name" : "Authenticate Only" + }, + { + "Code" : 9, + "Name" : "Callback NAS Prompt" + }, + { + "Code" : 14, + "Name" : "Modem Relay [Chiba]" + }, + { + "Code" : 11, + "Name" : "Callback Administrative" + }, + { + "Code" : 17, + "Name" : "Authorize Only [RFC3576]" + }, + { + "Code" : 16, + "Name" : "IAPP-AP-Check [IEEE 802.11f][Kerry]" + }, + { + "Code" : 15, + "Name" : "IAPP-Register [IEEE 802.11f][Kerry]" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Service-Type", + "Type" : "Unsigned32" + }, + { + "Code" : 7, + "EnumValues" : [ + { + "Code" : 1, + "Name" : "PPP" + }, + { + "Code" : 2, + "Name" : "SLIP" + }, + { + "Code" : 6, + "Name" : "X.75 Synchronous" + }, + { + "Code" : 7, + "Name" : "GPRS PDP Context [Moore]" + }, + { + "Code" : 5, + "Name" : "Xylogics proprietary IPX/SLIP" + }, + { + "Code" : 3, + "Name" : "AppleTalk Remote Access Protocol (ARAP)" + }, + { + "Code" : 4, + "Name" : "Gandalf proprietary SingleLink/MultiLink protocol" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Framed-Protocol", + "Type" : "Unsigned32" + }, + { + "Code" : 8, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Framed-IP-Address", + "Type" : "OctetString" + }, + { + "Code" : 9, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Framed-IP-Netmask", + "Type" : "OctetString" + }, + { + "Code" : 10, + "EnumValues" : [ + { + "Code" : 0, + "Name" : "None" + }, + { + "Code" : 3, + "Name" : "Send and Listen" + }, + { + "Code" : 1, + "Name" : "Send routing packets" + }, + { + "Code" : 2, + "Name" : "Listen for routing packets" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Framed-Routing", + "Type" : "Unsigned32" + }, + { + "Code" : 11, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Filter-Id", + "Type" : "UTF8String" + }, + { + "Code" : 12, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Framed-MTU", + "Type" : "Unsigned32" + }, + { + "Code" : 13, + "EnumValues" : [ + { + "Code" : 0, + "Name" : "None" + }, + { + "Code" : 3, + "Name" : "Stac-LZS compression" + }, + { + "Code" : 2, + "Name" : "IPX header compression" + }, + { + "Code" : 1, + "Name" : "VJ TCP/IP header compression" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Framed-Compression", + "Type" : "Unsigned32" + }, + { + "Code" : 14, + "EnumValues" : [ + { + "Code" : "<00000000>", + "Name" : "(0) NAS selects the host" + }, + { + "Code" : "", + "Name" : "(1) User selects the address" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Login-IP-Host", + "Type" : "OctetString" + }, + { + "Code" : 15, + "EnumValues" : [ + { + "Code" : 4, + "Name" : "LAT" + }, + { + "Code" : 1, + "Name" : "Rlogin" + }, + { + "Code" : 0, + "Name" : "Telnet" + }, + { + "Code" : 5, + "Name" : "X25-PAD" + }, + { + "Code" : 2, + "Name" : "TCP Clear" + }, + { + "Code" : 6, + "Name" : "X25-T3POS" + }, + { + "Code" : 3, + "Name" : "PortMaster (proprietary)" + }, + { + "Code" : 8, + "Name" : "TCP Clear Quiet (suppresses any NAS-generated connect string)" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Login-Service", + "Type" : "Unsigned32" + }, + { + "Code" : 16, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Login-TCP-Port", + "Type" : "Unsigned32" + }, + { + "Code" : 18, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Reply-Message", + "Type" : "UTF8String" + }, + { + "Code" : 19, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Callback-Number", + "Type" : "UTF8String" + }, + { + "Code" : 20, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Callback-Id", + "Type" : "UTF8String" + }, + { + "Code" : 22, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Framed-Route", + "Type" : "UTF8String" + }, + { + "Code" : 23, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Framed-IPX-Network", + "Type" : "Unsigned32" + }, + { + "Code" : 24, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "State", + "Type" : "OctetString" + }, + { + "Code" : 28, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Idle-Timeout", + "Type" : "Unsigned32" + }, + { + "Code" : 30, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Called-Station-Id", + "Type" : "UTF8String" + }, + { + "Code" : 31, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Calling-Station-Id", + "Type" : "UTF8String" + }, + { + "Code" : 32, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "NAS-Identifier", + "Type" : "UTF8String" + }, + { + "Code" : 34, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Login-LAT-Service", + "Type" : "OctetString" + }, + { + "Code" : 35, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Login-LAT-Node", + "Type" : "OctetString" + }, + { + "Code" : 36, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Login-LAT-Group", + "Type" : "OctetString" + }, + { + "Code" : 37, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Framed-AppleTalk-Link", + "Type" : "Unsigned32" + }, + { + "Code" : 38, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Framed-AppleTalk-Network", + "Type" : "Unsigned32" + }, + { + "Code" : 39, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Framed-AppleTalk-Zone", + "Type" : "OctetString" + }, + { + "Code" : 41, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Acct-Delay-Time", + "Type" : "Unsigned32" + }, + { + "Code" : 45, + "EnumValues" : [ + { + "Code" : 2, + "Name" : "Local" + }, + { + "Code" : 1, + "Name" : "RADIUS" + }, + { + "Code" : 3, + "Name" : "Remote" + }, + { + "Code" : 4, + "Name" : "Diameter" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Acct-Authentic", + "Type" : "Unsigned32" + }, + { + "Code" : 46, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Acct-Session-Time", + "Type" : "Unsigned32" + }, + { + "Code" : 51, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Acct-Link-Count", + "Type" : "Unsigned32" + }, + { + "Code" : 60, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "CHAP-Challenge", + "Type" : "OctetString" + }, + { + "Code" : 61, + "EnumValues" : [ + { + "Code" : 21, + "Name" : "FDDI [RFC3580]" + }, + { + "Code" : 1, + "Name" : "Sync [RFC2865]" + }, + { + "Code" : 8, + "Name" : "X.25 [RFC2865]" + }, + { + "Code" : 9, + "Name" : "X.75 [RFC2865]" + }, + { + "Code" : 0, + "Name" : "Async [RFC2865]" + }, + { + "Code" : 17, + "Name" : "Cable [RFC2865]" + }, + { + "Code" : 6, + "Name" : "PIAFS [RFC2865]" + }, + { + "Code" : 10, + "Name" : "G.3 Fax [RFC2865]" + }, + { + "Code" : 5, + "Name" : "Virtual [RFC2865]" + }, + { + "Code" : 15, + "Name" : "Ethernet [RFC2865]" + }, + { + "Code" : 2, + "Name" : "ISDN Sync [RFC2865]" + }, + { + "Code" : 20, + "Name" : "Token-Ring [RFC3580]" + }, + { + "Code" : 23, + "Name" : "Wireless - UMTS [McCann]" + }, + { + "Code" : 24, + "Name" : "Wireless - 1X-EV [McCann]" + }, + { + "Code" : 25, + "Name" : "IAPP [IEEE 802.11F][Kerry]" + }, + { + "Code" : 4, + "Name" : "ISDN Async V.110 [RFC2865]" + }, + { + "Code" : 3, + "Name" : "ISDN Async V.120 [RFC2865]" + }, + { + "Code" : 18, + "Name" : "Wireless - Other [RFC2865]" + }, + { + "Code" : 7, + "Name" : "HDLC Clear Channel [RFC2865]" + }, + { + "Code" : 22, + "Name" : "Wireless - CDMA2000 [McCann]" + }, + { + "Code" : 30, + "Name" : "PPPoA - PPP over ATM [RFC4603]" + }, + { + "Code" : 11, + "Name" : "SDSL - Symmetric DSL [RFC2865]" + }, + { + "Code" : 19, + "Name" : "Wireless - IEEE 802.11 [RFC2865]" + }, + { + "Code" : 26, + "Name" : "FTTP - Fiber to the Premises [Nyce]" + }, + { + "Code" : 27, + "Name" : "Wireless - IEEE 802.16 [IEEE 802.16]" + }, + { + "Code" : 28, + "Name" : "Wireless - IEEE 802.20 [IEEE 802.20]" + }, + { + "Code" : 29, + "Name" : "Wireless - IEEE 802.22 [IEEE 802.22]" + }, + { + "Code" : 35, + "Name" : "xPON - Passive Optical Network [Hublet][Yan]" + }, + { + "Code" : 14, + "Name" : "IDSL - ISDN Digital Subscriber Line [RFC2865]" + }, + { + "Code" : 31, + "Name" : "PPPoEoA - PPP over Ethernet over ATM [RFC4603]" + }, + { + "Code" : 33, + "Name" : "PPPoEoVLAN - PPP over Ethernet over VLAN [RFC4603]" + }, + { + "Code" : 32, + "Name" : "PPPoEoE - PPP over Ethernet over Ethernet [RFC4603]" + }, + { + "Code" : 13, + "Name" : "ADSL-DMT - Asymmetric DSL, Discrete Multi-Tone [RFC2865]" + }, + { + "Code" : 16, + "Name" : "xDSL - Digital Subscriber Line of unknown type [RFC2865]" + }, + { + "Code" : 34, + "Name" : "PPPoEoQinQ - PPP over Ethernet over IEEE 802.1QinQ [RFC4603]" + }, + { + "Code" : 12, + "Name" : "ADSL-CAP - Asymmetric DSL, Carrierless Amplitude Phase Modulation [RFC2865]" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "NAS-Port-Type", + "Type" : "Unsigned32" + }, + { + "Code" : 62, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Port-Limit", + "Type" : "Unsigned32" + }, + { + "Code" : 63, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Login-LAT-Port", + "Type" : "OctetString" + }, + { + "Code" : 64, + "EnumValues" : [ + { + "Code" : 12, + "Name" : "IP-in-IP Tunneling [RFC2868]" + }, + { + "Code" : 13, + "Name" : "Virtual LANs (VLAN) [RFC3580]" + }, + { + "Code" : 2, + "Name" : "Layer Two Forwarding (L2F) [RFC2868]" + }, + { + "Code" : 7, + "Name" : "IP-in-IP Encapsulation (IP-IP) [RFC2868]" + }, + { + "Code" : 11, + "Name" : "Bay Dial Virtual Services (DVS) [RFC2868]" + }, + { + "Code" : 5, + "Name" : "Virtual Tunneling Protocol (VTP) [RFC2868]" + }, + { + "Code" : 10, + "Name" : "Generic Route Encapsulation (GRE) [RFC2868]" + }, + { + "Code" : 3, + "Name" : "Layer Two Tunneling Protocol (L2TP) [RFC2868]" + }, + { + "Code" : 4, + "Name" : "Ascend Tunnel Management Protocol (ATMP) [RFC2868]" + }, + { + "Code" : 1, + "Name" : "Point-to-Point Tunneling Protocol (PPTP) [RFC2868]" + }, + { + "Code" : 8, + "Name" : "Minimal IP-in-IP Encapsulation (MIN-IP-IP) [RFC2868]" + }, + { + "Code" : 6, + "Name" : "IP Authentication Header in the Tunnel-mode (AH) [RFC2868]" + }, + { + "Code" : 9, + "Name" : "IP Encapsulating Security Payload in the Tunnel-mode (ESP) [RFC2868]" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Tunnel-Type", + "Type" : "Unsigned32" + }, + { + "Code" : 65, + "EnumValues" : [ + { + "Code" : 11, + "Name" : "IPX [RFC2868]" + }, + { + "Code" : 3, + "Name" : "NSAP [RFC2868]" + }, + { + "Code" : 5, + "Name" : "BBN 1822 [RFC2868]" + }, + { + "Code" : 12, + "Name" : "Appletalk [RFC2868]" + }, + { + "Code" : 13, + "Name" : "Decnet IV [RFC2868]" + }, + { + "Code" : 14, + "Name" : "Banyan Vines [RFC2868]" + }, + { + "Code" : 7, + "Name" : "E.163 (POTS) [RFC2868]" + }, + { + "Code" : 9, + "Name" : "F.69 (Telex) [RFC2868]" + }, + { + "Code" : 1, + "Name" : "IPv4 (IP version 4) [RFC2868]" + }, + { + "Code" : 2, + "Name" : "IPv6 (IP version 6) [RFC2868]" + }, + { + "Code" : 4, + "Name" : "HDLC (8-bit multidrop) [RFC2868]" + }, + { + "Code" : 10, + "Name" : "X.121 (X.25, Frame Relay) [RFC2868]" + }, + { + "Code" : 8, + "Name" : "E.164 (SMDS, Frame Relay, ATM) [RFC2868]" + }, + { + "Code" : 15, + "Name" : "E.164 with NSAP format subaddress [RFC2868]" + }, + { + "Code" : 6, + "Name" : "802 (includes all 802 media plus Ethernet \"canonical format\") [RFC2868]" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Tunnel-Medium-Type", + "Type" : "Unsigned32" + }, + { + "Code" : 66, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Tunnel-Client-Endpoint", + "Type" : "UTF8String" + }, + { + "Code" : 67, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Tunnel-Server-Endpoint", + "Type" : "UTF8String" + }, + { + "Code" : 68, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Acct-Tunnel-Connection", + "Type" : "OctetString" + }, + { + "Code" : 69, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Tunnel-Password", + "Type" : "OctetString" + }, + { + "Code" : 70, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "ARAP-Password", + "Type" : "OctetString" + }, + { + "Code" : 71, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "ARAP-Features", + "Type" : "OctetString" + }, + { + "Code" : 72, + "EnumValues" : [ + { + "Code" : 3, + "Name" : "Not used [RFC2869]" + }, + { + "Code" : 4, + "Name" : "Use zone filter exclusively [RFC2869]" + }, + { + "Code" : 2, + "Name" : "Use zone filter inclusively [RFC2869]" + }, + { + "Code" : 1, + "Name" : "Only allow access to default zone [RFC2869]" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "ARAP-Zone-Access", + "Type" : "Unsigned32" + }, + { + "Code" : 73, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "ARAP-Security", + "Type" : "Unsigned32" + }, + { + "Code" : 74, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "ARAP-Security-Data", + "Type" : "OctetString" + }, + { + "Code" : 75, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Password-Retry", + "Type" : "Unsigned32" + }, + { + "Code" : 76, + "EnumValues" : [ + { + "Code" : 1, + "Name" : "Echo [RFC2869]" + }, + { + "Code" : 0, + "Name" : "No Echo [RFC2869]" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Prompt", + "Type" : "Unsigned32" + }, + { + "Code" : 77, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Connect-Info", + "Type" : "UTF8String" + }, + { + "Code" : 78, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Configuration-Token", + "Type" : "OctetString" + }, + { + "Code" : 81, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Tunnel-Private-Group-Id", + "Type" : "OctetString" + }, + { + "Code" : 82, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Tunnel-Assignment-Id", + "Type" : "OctetString" + }, + { + "Code" : 83, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Tunnel-Preference", + "Type" : "Unsigned32" + }, + { + "Code" : 84, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "ARAP-Challenge-Response", + "Type" : "OctetString" + }, + { + "Code" : 86, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Acct-Tunnel-Packets-Lost", + "Type" : "Unsigned32" + }, + { + "Code" : 87, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "NAS-Port-Id", + "Type" : "UTF8String" + }, + { + "Code" : 88, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Framed-Pool", + "Type" : "OctetString" + }, + { + "Code" : 90, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Tunnel-Client-Auth-Id", + "Type" : "UTF8String" + }, + { + "Code" : 91, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Tunnel-Server-Auth-Id", + "Type" : "UTF8String" + }, + { + "Code" : 94, + "EnumValues" : [ + { + "Code" : "02", + "Name" : "ANI Failure" + }, + { + "Code" : "66", + "Name" : "TRS (Hotel)" + }, + { + "Code" : "23", + "Name" : "Coin or Non-Coin" + }, + { + "Code" : "67", + "Name" : "TRS (Restricted)" + }, + { + "Code" : "30", + "Name" : "Intercept (Blank)" + }, + { + "Code" : "32", + "Name" : "Intercept (Regular)" + }, + { + "Code" : "31", + "Name" : "Intercept (Trouble)" + }, + { + "Code" : "06", + "Name" : "Station Level Rating" + }, + { + "Code" : "29", + "Name" : "Prison/Inmate Service" + }, + { + "Code" : "34", + "Name" : "Telco Operator Handled Call" + }, + { + "Code" : "70", + "Name" : "Pay Station, No Coin Control" + }, + { + "Code" : "01", + "Name" : "Multiparty Line (more than 2)" + }, + { + "Code" : "61", + "Name" : "Cellular/Wireless PCS (Type 1)" + }, + { + "Code" : "62", + "Name" : "Cellular/Wireless PCS (Type 2)" + }, + { + "Code" : "63", + "Name" : "Cellular/Wireless PCS (Roaming)" + }, + { + "Code" : "00", + "Name" : "Plain Old Telephone Service (POTS)" + }, + { + "Code" : "07", + "Name" : "Special Operator Handling Required" + }, + { + "Code" : "25", + "Name" : "Toll Free Service (Pay Origination)" + }, + { + "Code" : "24", + "Name" : "Toll Free Service (Non-Pay Origination)" + }, + { + "Code" : "93", + "Name" : "Access for Private Virtual Network Service" + }, + { + "Code" : "20", + "Name" : "Automatic Identified Outward Dialing (AIOD)" + }, + { + "Code" : "27", + "Name" : "Toll Free Service (Coin Control Origination)" + }, + { + "Code" : "60", + "Name" : "Telecommunications Relay Service (TRS)(Unrestricted)" + }, + { + "Code" : "52", + "Name" : "Outward Wide Area Telecommunications Service (OUTWATS)" + } + ], + "Flags" : { + "Must" : "", + "MustNot" : "V" + }, + "Name" : "Originating-Line-Info", + "Type" : "OctetString" + }, + { + "Code" : 95, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "NAS-IPv6-Address", + "Type" : "OctetString" + }, + { + "Code" : 96, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Framed-Interface-Id", + "Type" : "Unsigned64" + }, + { + "Code" : 97, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Framed-IPv6-Prefix", + "Type" : "OctetString" + }, + { + "Code" : 98, + "EnumValues" : [ + { + "Code" : "<00000000000000000000000000000000>", + "Name" : "(0) NAS selects the host" + }, + { + "Code" : "", + "Name" : "(1) User selects the address" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Login-IPv6-Host", + "Type" : "OctetString" + }, + { + "Code" : 99, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Framed-IPv6-Route", + "Type" : "UTF8String" + }, + { + "Code" : 100, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Framed-IPv6-Pool", + "Type" : "OctetString" + }, + { + "Code" : 295, + "EnumValues" : [ + { + "Code" : 26, + "Name" : "[RADIUS] Callback" + }, + { + "Code" : 19, + "Name" : "[RADIUS] NAS Error" + }, + { + "Code" : 21, + "Name" : "[RADIUS] NAS Reboot" + }, + { + "Code" : 18, + "Name" : "[RADIUS] Port Error" + }, + { + "Code" : 27, + "Name" : "[RADIUS] User Error" + }, + { + "Code" : 16, + "Name" : "[RADIUS] Admin Reset" + }, + { + "Code" : 20, + "Name" : "[RADIUS] NAS Request" + }, + { + "Code" : 31, + "Name" : "[RADIUS] Port Reinit" + }, + { + "Code" : 17, + "Name" : "[RADIUS] Admin Reboot" + }, + { + "Code" : 28, + "Name" : "[RADIUS] Host Request" + }, + { + "Code" : 14, + "Name" : "[RADIUS] Idle Timeout" + }, + { + "Code" : 12, + "Name" : "[RADIUS] Lost Carrier" + }, + { + "Code" : 13, + "Name" : "[RADIUS] Lost Service" + }, + { + "Code" : 11, + "Name" : "[RADIUS] User Request" + }, + { + "Code" : 32, + "Name" : "[RADIUS] Port Disabled" + }, + { + "Code" : 22, + "Name" : "[RADIUS] Port Unneeded" + }, + { + "Code" : 23, + "Name" : "[RADIUS] Port Preempted" + }, + { + "Code" : 24, + "Name" : "[RADIUS] Port Suspended" + }, + { + "Code" : 15, + "Name" : "[RADIUS] Session Timeout" + }, + { + "Code" : 29, + "Name" : "[RADIUS] Supplicant Restart" + }, + { + "Code" : 25, + "Name" : "[RADIUS] Service Unavailable" + }, + { + "Code" : 30, + "Name" : "[RADIUS] Reauthentication Failure" + } + ], + "Name" : "Termination-Cause", + "Type" : "Enumerated" + }, + { + "Code" : 363, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Accounting-Input-Octets", + "Type" : "Unsigned64" + }, + { + "Code" : 364, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Accounting-Output-Octets", + "Type" : "Unsigned64" + }, + { + "Code" : 365, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Accounting-Input-Packets", + "Type" : "Unsigned64" + }, + { + "Code" : 366, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Accounting-Output-Packets", + "Type" : "Unsigned64" + }, + { + "Code" : 400, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "NAS-Filter-Rule", + "Type" : "IPFilterRule" + }, + { + "Code" : 401, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Tunneling", + "Type" : "Grouped" + }, + { + "Code" : 402, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "CHAP-Auth", + "Type" : "Grouped" + }, + { + "Code" : 403, + "EnumValues" : [ + { + "Code" : 5, + "Name" : "CHAP with MD5" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "CHAP-Algorithm", + "Type" : "Unsigned32" + }, + { + "Code" : 404, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "CHAP-Ident", + "Type" : "OctetString" + }, + { + "Code" : 405, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "CHAP-Response", + "Type" : "OctetString" + }, + { + "Code" : 406, + "EnumValues" : [ + { + "Code" : 5, + "Name" : "EAP" + }, + { + "Code" : 1, + "Name" : "PAP" + }, + { + "Code" : 2, + "Name" : "CHAP" + }, + { + "Code" : 7, + "Name" : "None" + }, + { + "Code" : 3, + "Name" : "MS-CHAP-1" + }, + { + "Code" : 4, + "Name" : "MS-CHAP-2" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Accounting-Auth-Method", + "Type" : "Unsigned32" + }, + { + "Code" : 407, + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "QoS-Filter-Rule", + "Type" : "QoSFilterRule" + }, + { + "Code" : 408, + "EnumValues" : [ + { + "Code" : 1, + "Name" : "RADIUS" + } + ], + "Flags" : { + "Must" : "M", + "MustNot" : "V" + }, + "Name" : "Origin-AAA-Protocol", + "Type" : "Unsigned32" + } + ], + "Applications" : [ + { + "Code" : 1, + "Name" : "Diameter Network Access Server Application" + } + ], + "CommandRules" : [ + { + "Command" : "Re-Auth-Request", + "Content" : [ + { + "AVP" : "NAS-IP-Address", + "Max" : 1 + }, + { + "AVP" : "NAS-Port", + "Max" : 1 + }, + { + "AVP" : "Service-Type", + "Max" : 1 + }, + { + "AVP" : "Framed-IP-Address", + "Max" : 1 + }, + { + "AVP" : "Reply-Message" + }, + { + "AVP" : "State", + "Max" : 1 + }, + { + "AVP" : "Class" + }, + { + "AVP" : "Called-Station-Id", + "Max" : 1 + }, + { + "AVP" : "Calling-Station-Id", + "Max" : 1 + }, + { + "AVP" : "NAS-Identifier", + "Max" : 1 + }, + { + "AVP" : "Acct-Session-Id", + "Max" : 1 + }, + { + "AVP" : "Acct-Multi-Session-Id", + "Max" : 1 + }, + { + "AVP" : "NAS-Port-Type", + "Max" : 1 + }, + { + "AVP" : "NAS-Port-Id", + "Max" : 1 + }, + { + "AVP" : "Originating-Line-Info", + "Max" : 1 + }, + { + "AVP" : "NAS-IPv6-Address", + "Max" : 1 + }, + { + "AVP" : "Framed-Interface-Id", + "Max" : 1 + }, + { + "AVP" : "Framed-IPv6-Prefix", + "Max" : 1 + }, + { + "AVP" : "Origin-AAA-Protocol", + "Max" : 1 + } + ] + }, + { + "Command" : "Re-Auth-Answer", + "Content" : [ + { + "AVP" : "Service-Type", + "Max" : 1 + }, + { + "AVP" : "Reply-Message" + }, + { + "AVP" : "State", + "Max" : 1 + }, + { + "AVP" : "Class" + }, + { + "AVP" : "Idle-Timeout", + "Max" : 1 + }, + { + "AVP" : "Prompt", + "Max" : 1 + }, + { + "AVP" : "Configuration-Token" + }, + { + "AVP" : "Auth-Grace-Period", + "Max" : 1 + }, + { + "AVP" : "Re-Auth-Request-Type", + "Max" : 1 + }, + { + "AVP" : "Authorization-Lifetime", + "Max" : 1 + }, + { + "AVP" : "Origin-AAA-Protocol", + "Max" : 1 + } + ] + }, + { + "Command" : "AA-Request", + "Content" : [ + { + "AVP" : "User-Name", + "Max" : 1 + }, + { + "AVP" : "User-Password", + "Max" : 1 + }, + { + "AVP" : "NAS-IP-Address", + "Max" : 1 + }, + { + "AVP" : "NAS-Port", + "Max" : 1 + }, + { + "AVP" : "Service-Type", + "Max" : 1 + }, + { + "AVP" : "Framed-Protocol", + "Max" : 1 + }, + { + "AVP" : "Framed-IP-Address", + "Max" : 1 + }, + { + "AVP" : "Framed-IP-Netmask", + "Max" : 1 + }, + { + "AVP" : "Framed-MTU", + "Max" : 1 + }, + { + "AVP" : "Framed-Compression" + }, + { + "AVP" : "Login-IP-Host" + }, + { + "AVP" : "Callback-Number", + "Max" : 1 + }, + { + "AVP" : "State", + "Max" : 1 + }, + { + "AVP" : "Called-Station-Id", + "Max" : 1 + }, + { + "AVP" : "Calling-Station-Id", + "Max" : 1 + }, + { + "AVP" : "NAS-Identifier", + "Max" : 1 + }, + { + "AVP" : "Login-LAT-Service", + "Max" : 1 + }, + { + "AVP" : "Login-LAT-Node", + "Max" : 1 + }, + { + "AVP" : "Login-LAT-Group", + "Max" : 1 + }, + { + "AVP" : "CHAP-Challenge", + "Max" : 1 + }, + { + "AVP" : "NAS-Port-Type", + "Max" : 1 + }, + { + "AVP" : "Port-Limit", + "Max" : 1 + }, + { + "AVP" : "Login-LAT-Port", + "Max" : 1 + }, + { + "AVP" : "ARAP-Password", + "Max" : 1 + }, + { + "AVP" : "ARAP-Security", + "Max" : 1 + }, + { + "AVP" : "ARAP-Security-Data" + }, + { + "AVP" : "Connect-Info", + "Max" : 1 + }, + { + "AVP" : "NAS-Port-Id", + "Max" : 1 + }, + { + "AVP" : "Originating-Line-Info", + "Max" : 1 + }, + { + "AVP" : "NAS-IPv6-Address", + "Max" : 1 + }, + { + "AVP" : "Framed-Interface-Id", + "Max" : 1 + }, + { + "AVP" : "Framed-IPv6-Prefix" + }, + { + "AVP" : "Login-IPv6-Host" + }, + { + "AVP" : "Auth-Application-Id", + "Max" : 1 + }, + { + "AVP" : "Session-Id", + "First" : true, + "Max" : 1 + }, + { + "AVP" : "Origin-Host", + "Max" : 1 + }, + { + "AVP" : "Auth-Request-Type", + "Max" : 1 + }, + { + "AVP" : "Auth-Grace-Period", + "Max" : 1 + }, + { + "AVP" : "Auth-Session-State", + "Max" : 1 + }, + { + "AVP" : "Origin-State-Id", + "Max" : 1 + }, + { + "AVP" : "Route-Record" + }, + { + "AVP" : "Destination-Realm", + "Max" : 1 + }, + { + "AVP" : "Proxy-Info" + }, + { + "AVP" : "Authorization-Lifetime", + "Max" : 1 + }, + { + "AVP" : "Destination-Host", + "Max" : 1 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1 + }, + { + "AVP" : "Tunneling" + }, + { + "AVP" : "CHAP-Auth", + "Max" : 1 + }, + { + "AVP" : "Origin-AAA-Protocol", + "Max" : 1 + } + ] + }, + { + "Command" : "AA-Answer", + "Content" : [ + { + "AVP" : "User-Name", + "Max" : 1 + }, + { + "AVP" : "Service-Type", + "Max" : 1 + }, + { + "AVP" : "Framed-Protocol", + "Max" : 1 + }, + { + "AVP" : "Framed-IP-Address", + "Max" : 1 + }, + { + "AVP" : "Framed-IP-Netmask" + }, + { + "AVP" : "Framed-Routing", + "Max" : 1 + }, + { + "AVP" : "Filter-Id" + }, + { + "AVP" : "Framed-MTU", + "Max" : 1 + }, + { + "AVP" : "Framed-Compression" + }, + { + "AVP" : "Login-IP-Host" + }, + { + "AVP" : "Login-Service", + "Max" : 1 + }, + { + "AVP" : "Login-TCP-Port", + "Max" : 1 + }, + { + "AVP" : "Reply-Message" + }, + { + "AVP" : "Callback-Number", + "Max" : 1 + }, + { + "AVP" : "Callback-Id", + "Max" : 1 + }, + { + "AVP" : "Framed-Route" + }, + { + "AVP" : "Framed-IPX-Network", + "Max" : 1 + }, + { + "AVP" : "State", + "Max" : 1 + }, + { + "AVP" : "Class" + }, + { + "AVP" : "Session-Timeout", + "Max" : 1 + }, + { + "AVP" : "Idle-Timeout", + "Max" : 1 + }, + { + "AVP" : "Login-LAT-Service", + "Max" : 1 + }, + { + "AVP" : "Login-LAT-Node", + "Max" : 1 + }, + { + "AVP" : "Login-LAT-Group", + "Max" : 1 + }, + { + "AVP" : "Framed-AppleTalk-Link", + "Max" : 1 + }, + { + "AVP" : "Framed-AppleTalk-Network" + }, + { + "AVP" : "Framed-AppleTalk-Zone", + "Max" : 1 + }, + { + "AVP" : "Port-Limit", + "Max" : 1 + }, + { + "AVP" : "Login-LAT-Port", + "Max" : 1 + }, + { + "AVP" : "ARAP-Features", + "Max" : 1 + }, + { + "AVP" : "ARAP-Zone-Access", + "Max" : 1 + }, + { + "AVP" : "ARAP-Security", + "Max" : 1 + }, + { + "AVP" : "ARAP-Security-Data" + }, + { + "AVP" : "Password-Retry", + "Max" : 1 + }, + { + "AVP" : "Prompt", + "Max" : 1 + }, + { + "AVP" : "Configuration-Token" + }, + { + "AVP" : "ARAP-Challenge-Response", + "Max" : 1 + }, + { + "AVP" : "Acct-Interim-Interval", + "Max" : 1 + }, + { + "AVP" : "Framed-Pool", + "Max" : 1 + }, + { + "AVP" : "Framed-Interface-Id" + }, + { + "AVP" : "Framed-IPv6-Prefix" + }, + { + "AVP" : "Login-IPv6-Host" + }, + { + "AVP" : "Framed-IPv6-Route" + }, + { + "AVP" : "Framed-IPv6-Pool", + "Max" : 1 + }, + { + "AVP" : "Auth-Application-Id", + "Max" : 1 + }, + { + "AVP" : "Redirect-Host-Usage", + "Max" : 1 + }, + { + "AVP" : "Redirect-Max-Cache-Time", + "Max" : 1 + }, + { + "AVP" : "Session-Id", + "First" : true, + "Max" : 1 + }, + { + "AVP" : "Origin-Host", + "Max" : 1 + }, + { + "AVP" : "Result-Code", + "Max" : 1 + }, + { + "AVP" : "Multi-Round-Time-Out", + "Max" : 1 + }, + { + "AVP" : "Auth-Request-Type", + "Max" : 1 + }, + { + "AVP" : "Auth-Grace-Period", + "Max" : 1 + }, + { + "AVP" : "Auth-Session-State", + "Max" : 1 + }, + { + "AVP" : "Origin-State-Id", + "Max" : 1 + }, + { + "AVP" : "Failed-AVP" + }, + { + "AVP" : "Error-Message", + "Max" : 1 + }, + { + "AVP" : "Proxy-Info" + }, + { + "AVP" : "Re-Auth-Request-Type", + "Max" : 1 + }, + { + "AVP" : "Authorization-Lifetime", + "Max" : 1 + }, + { + "AVP" : "Redirect-Host" + }, + { + "AVP" : "Error-Reporting-Host", + "Max" : 1 + }, + { + "AVP" : "Origin-Realm", + "Max" : 1 + }, + { + "AVP" : "NAS-Filter-Rule" + }, + { + "AVP" : "Tunneling" + }, + { + "AVP" : "QoS-Filter-Rule" + }, + { + "AVP" : "Origin-AAA-Protocol", + "Max" : 1 + } + ] + }, + { + "Command" : "Accounting-Request", + "Content" : [ + { + "AVP" : "NAS-IP-Address", + "Max" : 1 + }, + { + "AVP" : "NAS-Port", + "Max" : 1 + }, + { + "AVP" : "Service-Type", + "Max" : 1 + }, + { + "AVP" : "Framed-Protocol", + "Max" : 1 + }, + { + "AVP" : "Framed-IP-Address", + "Max" : 1 + }, + { + "AVP" : "Framed-IP-Netmask", + "Max" : 1 + }, + { + "AVP" : "Framed-Routing", + "Max" : 1 + }, + { + "AVP" : "Filter-Id" + }, + { + "AVP" : "Framed-MTU", + "Max" : 1 + }, + { + "AVP" : "Framed-Compression", + "Max" : 1 + }, + { + "AVP" : "Login-IP-Host" + }, + { + "AVP" : "Login-Service", + "Max" : 1 + }, + { + "AVP" : "Login-TCP-Port", + "Max" : 1 + }, + { + "AVP" : "Callback-Number", + "Max" : 1 + }, + { + "AVP" : "Callback-Id", + "Max" : 1 + }, + { + "AVP" : "Framed-Route" + }, + { + "AVP" : "Framed-IPX-Network", + "Max" : 1 + }, + { + "AVP" : "Class" + }, + { + "AVP" : "Session-Timeout", + "Max" : 1 + }, + { + "AVP" : "Idle-Timeout", + "Max" : 1 + }, + { + "AVP" : "Called-Station-Id", + "Max" : 1 + }, + { + "AVP" : "Calling-Station-Id", + "Max" : 1 + }, + { + "AVP" : "NAS-Identifier", + "Max" : 1 + }, + { + "AVP" : "Login-LAT-Service", + "Max" : 1 + }, + { + "AVP" : "Login-LAT-Node", + "Max" : 1 + }, + { + "AVP" : "Login-LAT-Group", + "Max" : 1 + }, + { + "AVP" : "Framed-AppleTalk-Link", + "Max" : 1 + }, + { + "AVP" : "Framed-AppleTalk-Network", + "Max" : 1 + }, + { + "AVP" : "Framed-AppleTalk-Zone", + "Max" : 1 + }, + { + "AVP" : "Acct-Delay-Time", + "Max" : 1 + }, + { + "AVP" : "Acct-Authentic", + "Max" : 1 + }, + { + "AVP" : "Acct-Session-Time", + "Max" : 1 + }, + { + "AVP" : "Acct-Link-Count", + "Max" : 1 + }, + { + "AVP" : "NAS-Port-Type", + "Max" : 1 + }, + { + "AVP" : "Port-Limit", + "Max" : 1 + }, + { + "AVP" : "Login-LAT-Port", + "Max" : 1 + }, + { + "AVP" : "Acct-Tunnel-Connection", + "Max" : 1 + }, + { + "AVP" : "Connect-Info" + }, + { + "AVP" : "Acct-Tunnel-Packets-Lost", + "Max" : 1 + }, + { + "AVP" : "NAS-Port-Id", + "Max" : 1 + }, + { + "AVP" : "Framed-Pool", + "Max" : 1 + }, + { + "AVP" : "Originating-Line-Info", + "Max" : 1 + }, + { + "AVP" : "NAS-IPv6-Address", + "Max" : 1 + }, + { + "AVP" : "Framed-Interface-Id", + "Max" : 1 + }, + { + "AVP" : "Framed-IPv6-Prefix" + }, + { + "AVP" : "Login-IPv6-Host" + }, + { + "AVP" : "Framed-IPv6-Route" + }, + { + "AVP" : "Framed-IPv6-Pool", + "Max" : 1 + }, + { + "AVP" : "Authorization-Lifetime", + "Max" : 1 + }, + { + "AVP" : "Termination-Cause", + "Max" : 1 + }, + { + "AVP" : "Accounting-Input-Octets", + "Max" : 1 + }, + { + "AVP" : "Accounting-Output-Octets", + "Max" : 1 + }, + { + "AVP" : "Accounting-Input-Packets", + "Max" : 1 + }, + { + "AVP" : "Accounting-Output-Packets", + "Max" : 1 + }, + { + "AVP" : "NAS-Filter-Rule" + }, + { + "AVP" : "Tunneling" + }, + { + "AVP" : "Accounting-Auth-Method", + "Max" : 1 + }, + { + "AVP" : "QoS-Filter-Rule" + }, + { + "AVP" : "Origin-AAA-Protocol", + "Max" : 1 + } + ] + }, + { + "Command" : "Accounting-Answer", + "Content" : [ + { + "AVP" : "NAS-IP-Address", + "Max" : 1 + }, + { + "AVP" : "NAS-Port", + "Max" : 1 + }, + { + "AVP" : "Service-Type", + "Max" : 1 + }, + { + "AVP" : "NAS-Identifier", + "Max" : 1 + }, + { + "AVP" : "NAS-Port-Type", + "Max" : 1 + }, + { + "AVP" : "NAS-Port-Id", + "Max" : 1 + }, + { + "AVP" : "NAS-IPv6-Address", + "Max" : 1 + }, + { + "AVP" : "Termination-Cause", + "Max" : 1 + }, + { + "AVP" : "Origin-AAA-Protocol", + "Max" : 1 + } + ] + }, + { + "Command" : "Abort-Session-Request", + "Content" : [ + { + "AVP" : "NAS-IP-Address", + "Max" : 1 + }, + { + "AVP" : "NAS-Port", + "Max" : 1 + }, + { + "AVP" : "Service-Type", + "Max" : 1 + }, + { + "AVP" : "Framed-IP-Address", + "Max" : 1 + }, + { + "AVP" : "Reply-Message" + }, + { + "AVP" : "State", + "Max" : 1 + }, + { + "AVP" : "Class" + }, + { + "AVP" : "Called-Station-Id", + "Max" : 1 + }, + { + "AVP" : "Calling-Station-Id", + "Max" : 1 + }, + { + "AVP" : "NAS-Identifier", + "Max" : 1 + }, + { + "AVP" : "Acct-Session-Id", + "Max" : 1 + }, + { + "AVP" : "Acct-Multi-Session-Id", + "Max" : 1 + }, + { + "AVP" : "NAS-Port-Type", + "Max" : 1 + }, + { + "AVP" : "NAS-Port-Id", + "Max" : 1 + }, + { + "AVP" : "Originating-Line-Info", + "Max" : 1 + }, + { + "AVP" : "NAS-IPv6-Address", + "Max" : 1 + }, + { + "AVP" : "Framed-Interface-Id", + "Max" : 1 + }, + { + "AVP" : "Framed-IPv6-Prefix", + "Max" : 1 + }, + { + "AVP" : "Origin-AAA-Protocol", + "Max" : 1 + } + ] + }, + { + "Command" : "Abort-Session-Answer", + "Content" : [ + { + "AVP" : "State", + "Max" : 1 + }, + { + "AVP" : "Origin-AAA-Protocol", + "Max" : 1 + } + ] + }, + { + "Command" : "Session-Termination-Request", + "Content" : [ + { + "AVP" : "Origin-AAA-Protocol", + "Max" : 1 + } + ] + }, + { + "Command" : "Session-Termination-Answer", + "Content" : [ + { + "AVP" : "Origin-AAA-Protocol", + "Max" : 1 + } + ] + } + ], + "Commands" : [ + { + "Code" : 265, + "Flags" : { + "Must" : "RP", + "MustNot" : "E" + }, + "Name" : "AA-Request" + }, + { + "Code" : 265, + "Flags" : { + "Must" : "P", + "MustNot" : "R" + }, + "Name" : "AA-Answer" + } + ], + "Types" : [ + { + "Base" : "OctetString", + "Name" : "QoSFilterRule" + } + ] +} + diff -r 229ecec59ff5 -r 73b9f2aefb75 doc/dbg_loglevel.conf.sample --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/dbg_loglevel.conf.sample Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,13 @@ +# This file contains information for configuring the dbg_loglevel extension. +# +# The dbg_loglevel extension allows changing the logging level at startup, +# and then changing it at runtime. +# +# This extension supports configuration reload at runtime. Send +# signal SIGUSR1 to the process to cause the process to reload its +# config. +# +# 3 is the default log level (FD_LOG_NOTICE) +# smaller values increase the logging +# bigger values reduce the logging +LogLevel=3; diff -r 229ecec59ff5 -r 73b9f2aefb75 doc/dict_json.json.sample --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/dict_json.json.sample Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,17 @@ +# Configuration for the JSON dictionary extension (no config file needed) +# +# This extension allows configuration of diameter dictionaries +# in JSON format. +# +# To load the JSON dictionaries, list their paths, separated with a semicolon (';') +# as argument when loading the extension in the freeDiameter config file, i.e.: +# +# LoadExtension = "dict_json.so":"/path/to/dictionary.json;/path/to/another/dictionary_2.json"; +# +# Relative paths work but are hard to get right because they are +# relative to where you started the freeDiameter daemon. +# +# The dictionaries must conform to the JSON schema in +# extensions/dict_json/dict_json_dict_schema.json +# +# Example dictionaries are in contrib/dict_json. diff -r 229ecec59ff5 -r 73b9f2aefb75 doc/rt_default.conf.sample --- a/doc/rt_default.conf.sample Sun Jan 21 22:25:07 2018 +0800 +++ b/doc/rt_default.conf.sample Sun May 12 23:15:40 2019 +0800 @@ -2,6 +2,10 @@ # # This extension provides configurable routing properties for freeDiameter. +# This extension supports configuration reload at runtime. Send +# signal SIGUSR1 to the process to cause the process to reload its +# config. + # Lines starting with a # are comments and ignored. ############################################################################## diff -r 229ecec59ff5 -r 73b9f2aefb75 doc/rt_deny_by_size.conf.sample --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/rt_deny_by_size.conf.sample Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,11 @@ +# This file contains information for configuring the rt_deny_by_size extension. +# +# The rt_deny_by_size extension returns errors for messages above a particular size. +# +# This extension supports configuration reload at runtime. Send +# signal SIGUSR1 to the process to cause the process to reload its +# config. +# +# Configure the maximum allowed message size to still pass through; +# defaults to 4096, if config file is empty +#MaximumSize=4096; diff -r 229ecec59ff5 -r 73b9f2aefb75 doc/rt_ereg.conf.sample --- a/doc/rt_ereg.conf.sample Sun Jan 21 22:25:07 2018 +0800 +++ b/doc/rt_ereg.conf.sample Sun May 12 23:15:40 2019 +0800 @@ -3,9 +3,15 @@ # # The rt_ereg extension allows creation of routing rules based on AVP value matching regular expressions. +# This extension supports configuration reload at runtime. Send +# signal SIGUSR1 to the process to cause the process to reload its +# config. + # First, one must indicate which AVP should be used for matching. # At the moment, only AVP with OCTETSTRING types are valid. # AVP = "User-Name"; +# It is possible to specify AVPs below GROUPED AVPs with the by separating AVPs with a colon (':'): +# AVP = "Grouped-AVP1" : "Grouped-AVP2" : "Octetstring-AVP"; # This parameter is mandatory. There is no default value. # Then a list of rules follow. A rule has this format: @@ -19,3 +25,7 @@ # means that if the AVP value is only numeric, the ServerA will have its score decreased by 3 points. # (reminder: the server with the peer with the highest score gets the message) # Note that all rules are tested for each message that contain the AVP, not only the first match. + +# There can be multiple blocks of AVPs and rules; just start the next one with another AVP line: +# AVP = "Other-AVP"; +# and continue with rules as above. diff -r 229ecec59ff5 -r 73b9f2aefb75 doc/rt_rewrite.conf.sample --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/rt_rewrite.conf.sample Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,23 @@ +# This file contains information for configuring the rt_rewrite extension +# To find how to have freeDiameter load this extension, please refer to the freeDiameter documentation. +# +# The rt_rewrite extension allows moving data from one AVP into another one, or dropping AVPs altogether. + +# This extension supports configuration reload at runtime. Send +# signal SIGUSR1 to the process to cause the process to reload its +# config. + +# The config consists of MAP for AVP pairs of source/target, or DROP for a source. +# +# MAP = "Source-AVP" > "Destination-AVP"; +# +# It is possible to specify AVPs below GROUPED AVPs with the by separating AVPs with a colon (':'): +# MAP = "Grouped-AVP1" : "Octetstring-AVP1" > "Grouped-AVP2" : "Grouped-AVP3" : "Octetstring-AVP2"; +# Intermediate destination grouped AVPs will be created automatically. +# +# NOTE: you can not move grouped AVPs as a unit, you have to move each separate AVP. +# i.e., this will not work: +# MAP = "Grouped-AVP1" > "Grouped-AVP2"; +# +# For removing AVPs, use DROP: +# DROP = "Grouped-AVP1" : "Octetstring-AVP1"; diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/CMakeLists.txt --- a/extensions/CMakeLists.txt Sun Jan 21 22:25:07 2018 +0800 +++ b/extensions/CMakeLists.txt Sun May 12 23:15:40 2019 +0800 @@ -12,7 +12,7 @@ SET_TARGET_PROPERTIES(${EXTNAME} PROPERTIES SUFFIX ".fdx" ) ENDMACRO(FD_ADD_EXTENSION) -# Use the macro FD_EXTENSION_SUBDIR(extmacroname subdir descr default) to +# Use the macro FD_EXTENSION_SUBDIR(extmacroname subdir descr default) to # add a new extension subdirectory. MACRO(FD_EXTENSION_SUBDIR EXTSUBDIR EXTDESCR EXTDEFAULT) STRING(TOUPPER ${EXTSUBDIR} EXTMACRONAME) @@ -39,9 +39,9 @@ FD_EXTENSION_SUBDIR(dict_nasreq "NASREQ (RFC4005) Dictionary definitions" ON) FD_EXTENSION_SUBDIR(dict_eap "Diameter EAP (RFC4072) Dictionary definitions" ON) -FD_EXTENSION_SUBDIR(dict_dcca "Diameter CC (RFC4006) Dictionary definitions [incomplete]" ON) -FD_EXTENSION_SUBDIR(dict_dcca_3gpp "Diameter CC 3GPP Dictionary definitions [incomplete]" ON) -FD_EXTENSION_SUBDIR(dict_dcca_starent "Diameter CC Starent Dictionary definitions" ON) +FD_EXTENSION_SUBDIR(dict_dcca "Diameter CC (RFC4006) Dictionary definitions [incomplete]" ON) +FD_EXTENSION_SUBDIR(dict_dcca_3gpp "Diameter CC 3GPP Dictionary definitions [incomplete]" ON) +FD_EXTENSION_SUBDIR(dict_dcca_starent "Diameter CC Starent Dictionary definitions" ON) FD_EXTENSION_SUBDIR(dict_sip "Diameter SIP (RFC4740) Dictionary definitions" ON) @@ -50,6 +50,7 @@ FD_EXTENSION_SUBDIR(dict_nas_mipv6 "Diameter NAS-to-HAAA Interaction Dictionary definitions" ON) FD_EXTENSION_SUBDIR(dict_rfc5777 "Classification and QoS (RFC 5777) Dictionary definitions" ON) +FD_EXTENSION_SUBDIR(dict_json "Load Diameter dictionary definitions from JSON files." OFF) FD_EXTENSION_SUBDIR(dict_legacy_xml "Load Diameter dictionary definitions from XML files." OFF) @@ -67,13 +68,15 @@ #### # Routing extensions -FD_EXTENSION_SUBDIR(rt_busypeers "Handling of Diameter TOO_BUSY messages and relay timeouts" ON) -FD_EXTENSION_SUBDIR(rt_default "Configurable routing rules for freeDiameter" ON) -FD_EXTENSION_SUBDIR(rt_ereg "Configurable routing based on regexp matching of AVP values" OFF) -FD_EXTENSION_SUBDIR(rt_ignore_dh "Stow Destination-Host in Proxy-Info, restore to Origin-Host for answers" ON) +FD_EXTENSION_SUBDIR(rt_busypeers "Handling of Diameter TOO_BUSY messages and relay timeouts" ON) +FD_EXTENSION_SUBDIR(rt_default "Configurable routing rules for freeDiameter" ON) +FD_EXTENSION_SUBDIR(rt_deny_by_size "Deny messages that are larger than a configured size" ON) +FD_EXTENSION_SUBDIR(rt_ereg "Configurable routing based on regexp matching of AVP values" OFF) +FD_EXTENSION_SUBDIR(rt_ignore_dh "Stow Destination-Host in Proxy-Info, restore to Origin-Host for answers" ON) FD_EXTENSION_SUBDIR(rt_load_balance "Balance load over multiple equal hosts, based on outstanding requests" ON) -FD_EXTENSION_SUBDIR(rt_randomize "Randomly choose one of the highest scored hosts and increase its score by one" ON) -FD_EXTENSION_SUBDIR(rt_redirect "Handling of Diameter Redirect messages" ON) +FD_EXTENSION_SUBDIR(rt_randomize "Randomly choose one of the highest scored hosts and increase its score by one" ON) +FD_EXTENSION_SUBDIR(rt_redirect "Handling of Diameter Redirect messages" ON) +FD_EXTENSION_SUBDIR(rt_rewrite "Convert/remove AVP data in messages" ON) #### @@ -85,14 +88,17 @@ #### # Debug & test extensions -FD_EXTENSION_SUBDIR(dbg_monitor "Outputs periodical status information" ON) +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) -FD_EXTENSION_SUBDIR(dbg_msg_dumps "Show human-readable content of the received & sent messages" ON) -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_sip "Testing application to simulate Diameter-SIP client (RFC4740)" OFF) +FD_EXTENSION_SUBDIR(dbg_msg_dumps "Show human-readable content of the received & sent messages" ON) +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_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) +FD_EXTENSION_SUBDIR(test_netemul "Simple Diameter network emulator proxy extension (latency, PDV, duplicates)" OFF) diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/dbg_loglevel/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/dbg_loglevel/CMakeLists.txt Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,28 @@ +# The dbg_loglevel extension +PROJECT("Debugging extension that allows changing the log level at runtime" C) + +# Parser files +BISON_FILE(dbg_loglevel_conf.y) +FLEX_FILE(dbg_loglevel_conf.l) +SET_SOURCE_FILES_PROPERTIES(lex.dbg_loglevel_conf.c dbg_loglevel_conf.tab.c PROPERTIES COMPILE_FLAGS "-I ${CMAKE_CURRENT_SOURCE_DIR}") + +# List of source files +SET(DBG_LOGLEVEL_SRC + dbg_loglevel.c + dbg_loglevel.h + lex.dbg_loglevel_conf.c + dbg_loglevel_conf.tab.c + dbg_loglevel_conf.tab.h +) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) + +# Compile these files as a freeDiameter extension +FD_ADD_EXTENSION(dbg_loglevel ${DBG_LOGLEVEL_SRC}) + +#### +## INSTALL section ## + +INSTALL(TARGETS dbg_loglevel + LIBRARY DESTINATION ${INSTALL_EXTENSIONS_SUFFIX} + COMPONENT freeDiameter-debug-tools) diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/dbg_loglevel/dbg_loglevel.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/dbg_loglevel/dbg_loglevel.c Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,89 @@ +/********************************************************************************************************* +* Software License Agreement (BSD License) * +* Author: Thomas Klausner * +* * +* Copyright (c) 2019, Thomas Klausner * +* All rights reserved. * +* * +* Written under contract by Effortel Technologies SA, http://effortel.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. * +* * +* * 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. * +*********************************************************************************************************/ + +#include + +/* See doc/dbg_loglevel.conf.sample for more details about the features of this extension */ +#include "dbg_loglevel.h" + +static char *config_file = NULL; +#define MODULE_NAME "dbg_loglevel" + +static void sig_hdlr(void) +{ + int old_log_level; + + old_log_level = fd_g_debug_lvl; + if (dbg_loglevel_conf_handle(config_file) != 0) { + fd_log_error("%s: error during config file reload, restoring previous value", MODULE_NAME); + fd_g_debug_lvl = old_log_level; + } + fd_log_notice("%s: reloaded configuration, log level now %d", MODULE_NAME, fd_g_debug_lvl); +} + +/* entry point */ +static int dbg_loglevel_entry(char * conffile) +{ + TRACE_ENTRY("%p", conffile); + + config_file = conffile; + + /* default set by main program */ + /* fd_g_debug_lvl = FD_LOG_NOTICE; */ + + /* Parse the configuration file */ + CHECK_FCT(dbg_loglevel_conf_handle(config_file)); + + /* Register reload callback */ + CHECK_FCT(fd_event_trig_regcb(SIGUSR1, MODULE_NAME, sig_hdlr)); + + fd_log_notice("Extension 'Loglevel' initialized with log level %d", fd_g_debug_lvl); + + /* We're done */ + return 0; +} + +/* Unload */ +void fd_ext_fini(void) +{ + TRACE_ENTRY(); + + /* Nothing to do */ + return ; +} + +EXTENSION_ENTRY(MODULE_NAME, dbg_loglevel_entry); diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/dbg_loglevel/dbg_loglevel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/dbg_loglevel/dbg_loglevel.h Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,47 @@ +/********************************************************************************************************* +* Software License Agreement (BSD License) * +* Author: Thomas Klausner * +* * +* Copyright (c) 2019, Thomas Klausner * +* All rights reserved. * +* * +* Written under contract by Effortel Technologies SA, http://effortel.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. * +* * +* * 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. * +*********************************************************************************************************/ + +/* + * See the dbg_loglevel.conf.sample file for the format of the configuration file. + */ + +/* FreeDiameter's common include file */ +#include + +/* Parse the configuration file */ +int dbg_loglevel_conf_handle(char *); + diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/dbg_loglevel/dbg_loglevel_conf.l --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/dbg_loglevel/dbg_loglevel_conf.l Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,107 @@ +/********************************************************************************************************* +* Software License Agreement (BSD License) * +* Authors: Thomas Klausner based on code by Sebastien Decugis * +* * +* Copyright (c) 2019, Thomas Klausner * +* Copyright (c) 2013, WIDE Project and NICT * +* All rights reserved. * +* * +* Written under contract by Effortel Technologies SA, http://effortel.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. * +* * +* * 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. * +*********************************************************************************************************/ + +/* Tokenizer + * + */ + +%{ +#include "dbg_loglevel.h" +#include "dbg_loglevel_conf.tab.h" + +/* Update the column information */ +#define YY_USER_ACTION { \ + yylloc->first_column = yylloc->last_column + 1; \ + yylloc->last_column = yylloc->first_column + yyleng - 1; \ +} + +/* Avoid warning with newer flex */ +#define YY_NO_INPUT + +%} + +qstring \"[^\"\n]*\" + + +%option bison-bridge bison-locations +%option noyywrap +%option nounput + +%% + + /* Update the line count */ +\n { + yylloc->first_line++; + yylloc->last_line++; + yylloc->last_column=0; + } + + /* Eat all spaces but not new lines */ +([[:space:]]{-}[\n])+ ; + /* Eat all comments */ +#.*$ ; + + /* Recognize any integer */ +[-]?[[:digit:]]+ { + /* Convert this to an integer value */ + int ret=0; + ret = sscanf(yytext, "%i", &yylval->integer); + if (ret != 1) { + /* No matching: an error occurred */ + TRACE_ERROR("Unable to convert the value '%s' to a valid number: %s", yytext, strerror(errno)); + return LEX_ERROR; /* trig an error in yacc parser */ + /* Maybe we could REJECT instead of failing here? */ + } + return INTEGER; + } + + + + /* The key words */ +(?i:"LogLevel") { return LOGLEVEL; } + + /* Valid single characters for yyparse */ +[=;] { return yytext[0]; } + + /* Unrecognized sequence, if it did not match any previous pattern */ +[^[:space:]=;\n]+ { + TRACE_ERROR("Unrecognized text on line %d col %d: '%s'.", yylloc->first_line, yylloc->first_column, yytext); + return LEX_ERROR; + } + +%% diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/dbg_loglevel/dbg_loglevel_conf.y --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/dbg_loglevel/dbg_loglevel_conf.y Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,147 @@ +/********************************************************************************************************* +* Software License Agreement (BSD License) * +* Author: Thomas Klausner * +* * +* Copyright (c) 2019, Thomas Klausner * +* All rights reserved. * +* * +* Written under contract by Effortel Technologies SA, http://effortel.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. * +* * +* * 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. * +*********************************************************************************************************/ + +/* Yacc extension's configuration parser. + */ + +/* For development only : */ +%debug +%error-verbose + +/* The parser receives the configuration file filename as parameter */ +%parse-param {char * conffile} + +/* Keep track of location */ +%locations +%pure-parser + +%{ +#include "dbg_loglevel.h" +#include "dbg_loglevel_conf.tab.h" + +/* Forward declaration */ +int dbg_loglevel_confparse(char *conffile); +void dbg_loglevel_confrestart(FILE *input_file); + +/* Parse the configuration file */ +int dbg_loglevel_conf_handle(char * conffile) +{ + extern FILE *dbg_loglevel_confin; + int ret; + + TRACE_ENTRY("%p", conffile); + + TRACE_DEBUG(FULL, "Parsing configuration file: %s...", conffile); + + dbg_loglevel_confin = fopen(conffile, "r"); + if (dbg_loglevel_confin == NULL) { + ret = errno; + TRACE_ERROR("Unable to open extension configuration file %s for reading: %s", conffile, strerror(ret)); + return ret; + } + + dbg_loglevel_confrestart(dbg_loglevel_confin); + ret = dbg_loglevel_confparse(conffile); + + fclose(dbg_loglevel_confin); + + if (ret != 0) { + TRACE_ERROR( "Unable to parse the configuration file %s.", conffile); + return EINVAL; + } else { + TRACE_DEBUG(FULL, "[dbg_loglevel] LogLevel: %d.", fd_g_debug_lvl); + } + + return 0; +} + +/* The Lex parser prototype */ +int dbg_loglevel_conflex(YYSTYPE *lvalp, YYLTYPE *llocp); + +/* Function to report the errors */ +void yyerror (YYLTYPE *ploc, char * conffile, char const *s) +{ + TRACE_DEBUG(INFO, "Error in configuration parsing"); + + if (ploc->first_line != ploc->last_line) + fd_log_error("%s:%d.%d-%d.%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_line, ploc->last_column, s); + else if (ploc->first_column != ploc->last_column) + fd_log_error("%s:%d.%d-%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_column, s); + else + fd_log_error("%s:%d.%d : %s", conffile, ploc->first_line, ploc->first_column, s); +} + +%} + +/* Values returned by lex for token */ +%union { + int integer; +} + +/* In case of error in the lexical analysis */ +%token LEX_ERROR + +/* A (de)quoted string (malloc'd in lex parser; it must be freed after use) */ +%token INTEGER + +/* Tokens */ +%token LOGLEVEL + + +/* -------------------------------------- */ +%% + + /* The grammar definition */ +conffile: /* empty is OK */ + | conffile size + | conffile errors + { + yyerror(&yylloc, conffile, "An error occurred while parsing the configuration file"); + YYABORT; + } + ; + + /* Lexical or syntax error */ +errors: LEX_ERROR + | error + ; + +size: LOGLEVEL '=' INTEGER ';' + { + fd_g_debug_lvl=$3; + } + ; diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/dict_dcca_3gpp/dict_dcca_3gpp.c --- a/extensions/dict_dcca_3gpp/dict_dcca_3gpp.c Sun Jan 21 22:25:07 2018 +0800 +++ b/extensions/dict_dcca_3gpp/dict_dcca_3gpp.c Sun May 12 23:15:40 2019 +0800 @@ -10587,6 +10587,21 @@ struct dict_object *rule_avp; struct dict_avp_request vpa; vpa.avp_vendor = 10415; + vpa.avp_name = "Originator-Received-Address"; + 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 }, + }; + PARSE_loc_rules(rules, rule_avp); + } + + { + struct dict_object *rule_avp; + struct dict_avp_request vpa; + vpa.avp_vendor = 10415; vpa.avp_name = "PS-Furnish-Charging-Information"; CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); struct local_rules_definition rules[] = diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/dict_json/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/dict_json/CMakeLists.txt Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,43 @@ +# The dict_json extension +PROJECT("JSON dictionary files support" C) + +INCLUDE(FindPkgConfig) + +# We use JSONCPP and JSON-Schema to parse and validate JSON files +PKG_CHECK_MODULES(JSONCPP REQUIRED jsoncpp) +PKG_CHECK_MODULES(JSON_SCHEMA REQUIRED json-schema) + +# List of source files +SET(DICT_JSON_SRC + dict_json.cc + dict_json_dict_schema.cc +) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) +INCLUDE_DIRECTORIES(${JSONCPP_INCLUDE_DIR}) +INCLUDE_DIRECTORIES(${JSON_SCHEMA_INCLUDE_DIR}) + +LINK_DIRECTORIES(${JSONCPP_LIBDIR}) +LINK_DIRECTORIES(${JSON_SCHEMA_LIBDIR}) + +# Compile these files as a freeDiameter extension +FD_ADD_EXTENSION(dict_json ${DICT_JSON_SRC}) + +TARGET_LINK_LIBRARIES(dict_json ${JSONCPP_LIBRARIES} ${JSON_SCHEMA_STATIC_LIBRARIES}) + +ADD_EXECUTABLE(dict-json-diff dict-json-diff.cc) +TARGET_LINK_LIBRARIES(dict-json-diff ${JSONCPP_LIBRARIES} ${JSON_SCHEMA_STATIC_LIBRARIES}) + + +#### +## INSTALL section ## + +INSTALL(TARGETS dict_json + LIBRARY DESTINATION ${INSTALL_EXTENSIONS_SUFFIX} + COMPONENT freeDiameter-dictionary-json) +INSTALL(TARGETS dict-json-diff + RUNTIME DESTINATION ${INSTALL_DAEMON_SUFFIX} + COMPONENT freeDiameter-dictionary-json) + +# dict_json_dict_schema.cc is created from dict_json_dict_schema.json +# the tool for that is not yet open source, but the conversion is straightforward diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/dict_json/dict-json-diff.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/dict_json/dict-json-diff.cc Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,352 @@ +/********************************************************************************************************** + * Software License Agreement (BSD License) * + * Author: Thomas Klausner * + * * + * Copyright (c) 2016, 2017, 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. * + **********************************************************************************************************/ + +/* + * Show what was added from one dictionary dump JSON file compared to a second one + */ +#include + +#include +#include +#include + +using namespace std; + +void json_compare_arrays(Json::Value &base, Json::Value &big, Json::Value &diff, string name, string key, string key2); + +void +json_compare_objects(Json::Value &base, Json::Value &big, Json::Value &diff, string name) +{ + Json::Value::Members members = big[name].getMemberNames(); + for (auto it = members.begin() ; it != members.end(); ++it) { + if (!base[name].isMember(*it) || + (base[name][*it] != big[name][*it])) { + diff[name][*it] = big[name][*it]; + } + } +} + +void +json_compare_avps(Json::Value &base, Json::Value &big, Json::Value &diff, string name) +{ + Json::Value left = base[name]; + Json::Value right = big[name]; + + if (left.type() != right.type() || left.empty()) { + if (!right.empty()) { + diff[name] = right; + } + return; + } + + if (!left.isArray()) { + cerr << name << " member not an array\n"; + return; + } + + for (unsigned int i=0; i * + * * + * Copyright (c) 2016, 2017, 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. * + **********************************************************************************************************/ + +/* + * Extend a dictionary using data from a JSON file. + * + */ +#include +#include +#include +#include + +extern const char *dict_json_dict_schema; + +static int +make_type(const char *typestring, struct dict_object **type) +{ + *type = NULL; + + if (strcmp("Unsigned32", typestring) == 0) + return AVP_TYPE_UNSIGNED32; + else if (strcmp("Enumerated", typestring) == 0 || strcmp("Integer32", typestring) == 0) + return AVP_TYPE_INTEGER32; + else if (strcmp("OctetString", typestring) == 0) + return AVP_TYPE_OCTETSTRING; + else if (strcmp("Grouped", typestring) == 0) + return AVP_TYPE_GROUPED; + else if (strcmp("Integer64", typestring) == 0) + return AVP_TYPE_INTEGER64; + else if (strcmp("Unsigned64", typestring) == 0) + return AVP_TYPE_UNSIGNED64; + else if (strcmp("Float32", typestring) == 0) + return AVP_TYPE_FLOAT32; + else if (strcmp("Float64", typestring) == 0) + return AVP_TYPE_FLOAT64; + else { + if (fd_dict_search(fd_g_config->cnf_dict, DICT_TYPE, TYPE_BY_NAME, typestring, type, ENOENT) != 0) { + LOG_E("Unknown type '%s'", typestring); + return -1; + } + return AVP_TYPE_OCTETSTRING; + } + + return -1; +} + + +static uint8_t +make_avp_flags(const char *flagstring) +{ + uint8_t flags = 0; + + if (strchr(flagstring, 'M') != NULL) + flags |= AVP_FLAG_MANDATORY; + if (strchr(flagstring, 'V') != NULL) + flags |= AVP_FLAG_VENDOR; + + return flags; +} + +static uint8_t +make_command_flags(const char *flagstring) +{ + uint8_t flags = 0; + + if (strchr(flagstring, 'E') != NULL) + flags |= CMD_FLAG_ERROR; + if (strchr(flagstring, 'P') != NULL) + flags |= CMD_FLAG_PROXIABLE; + if (strchr(flagstring, 'R') != NULL) + flags |= CMD_FLAG_REQUEST; + + return flags; +} + + +static bool +add_applications(const Json::Value &config) +{ + Json::Value applications = config["Applications"]; + if (applications == Json::Value::null) + return true; + for (Json::ArrayIndex i=0; icnf_dict, DICT_APPLICATION, &application_data, NULL, NULL)) != 0) { + LOG_E("error adding Application '%s' to dictionary: %s", applications[i]["Name"].asCString(), strerror(ret)); + return false; + } + LOG_D("Added Application '%s' to dictionary", applications[i]["Name"].asCString()); + } + + return true; +} + +static bool +add_enumtype(const char *enumtypename, enum dict_avp_basetype basetype, struct dict_object **enumtype) +{ + struct dict_type_data data; + int ret; + + memset(&data, 0, sizeof(data)); + data.type_base = basetype; + data.type_name = (char *)(void *)enumtypename; + data.type_interpret = NULL; + data.type_encode = NULL; + data.type_dump = NULL; + if ((ret=fd_dict_new(fd_g_config->cnf_dict, DICT_TYPE, &data, NULL, enumtype)) != 0) { + /* TODO: allow ret == EEXIST? */ + LOG_E("error defining type '%s': %s", enumtypename, strerror(ret)); + return false; + } + LOG_D("Added enumerated type '%s' to dictionary", enumtypename); + + return true; +} + +static unsigned int +hexchar(char input) { + if (input >= '0' and input <= '9') + return input - '0'; + if (input >= 'a' and input <= 'f') + return input - 'a' + 10; + if (input >= 'A' and input <= 'F') + return input - 'a' + 10; + + return 0; +} + +static char +hexdecode(const char *input) { + return (char)(hexchar(input[0])*16 + hexchar(input[1])); +} + +static char * +unpack_enumval_os(const Json::Value &enumvalue, unsigned int &len) +{ + if (!enumvalue.isString()) { + len = 0; + return NULL; + } + len = enumvalue.asString().size(); + if (enumvalue.asString()[0] == '<' && enumvalue.asString()[len-1] == '>') { + char *retstr; + len = len/2 - 1; + if ((retstr = (char *)malloc(len)) == NULL) { + return retstr; + } + for (size_t i=0; icnf_dict, DICT_ENUMVAL, &data, enumtype, NULL)) != 0) { + LOG_E("error adding EnumValue '%s' for AVP '%s' to dictionary: %s", enumvalue["Name"].asCString(), avpname, strerror(errno)); + return false; + } + LOG_D("Added enumerated value '%s' to dictionary", enumvalue["Name"].asCString()); + + if (free_os) { + free(data.enum_value.os.data); + } + + return true; +} + +static bool +add_avp(const Json::Value &avp) +{ + int bt; + struct dict_avp_data data; + struct dict_object *type = NULL; + struct dict_avp_request dar; + struct dict_object *existing_avp_obj; + int fds_ret; + + if (!avp["Code"] || !avp["Name"] || !avp["Type"]) { + LOG_E("invalid AVP, need Code, Name, and Type"); + return false; + } + + memset(&data, 0, sizeof(data)); + + data.avp_code = avp["Code"].asUInt(); + data.avp_vendor = 0; + data.avp_name = (char *)(void *)avp["Name"].asCString(); + data.avp_flag_mask = 0; + if (avp["Flags"]["Must"] != Json::Value::null) { + data.avp_flag_mask = data.avp_flag_val = make_avp_flags(avp["Flags"]["Must"].asCString()); + } + if (avp["Flags"]["MustNot"] != Json::Value::null) { + data.avp_flag_mask |= make_avp_flags(avp["Flags"]["MustNot"].asCString()); + } + if (avp["Vendor"] != Json::Value::null) { + data.avp_vendor = avp["Vendor"].asUInt(); + if ((data.avp_flag_mask & AVP_FLAG_VENDOR) == 0) { + LOG_D("Vendor flag not set for AVP '%s'", data.avp_name); + // error out? + } + data.avp_flag_mask |= AVP_FLAG_VENDOR; + data.avp_flag_val |= AVP_FLAG_VENDOR; + } + bt = make_type(avp["Type"].asCString(), &type); + if (bt == -1) { + LOG_E("Unknown AVP type %s", avp["Type"].asCString()); + return false; + } + data.avp_basetype = (enum dict_avp_basetype)bt; + + if (avp["EnumValues"] != Json::Value::null || avp["Type"] == "Enumerated") { + if (avp["Type"] != "Enumerated") { + LOG_D("AVP '%s': EnumValues defined for non-Enumerated type (freeDiameter extension); type is '%s'", avp["Name"].asCString(), avp["Type"].asCString()); + } + Json::Value enumvalues = avp["EnumValues"]; + std::string enumtypename = "Enumerated(" + avp["Name"].asString() + ")"; + if (!add_enumtype(enumtypename.c_str(), data.avp_basetype, &type)) { + LOG_E("Unknown AVP Enum: %s", enumtypename.c_str()); + return false; + } + for (Json::ArrayIndex i=0; icnf_dict, DICT_AVP, AVP_BY_NAME_AND_VENDOR, &dar, &existing_avp_obj, ENOENT); + if (fds_ret == 0) { + struct dict_avp_data existing_avp; + if (fd_dict_getval(existing_avp_obj, &existing_avp) < 0) { + LOG_E("Cannot get information for AVP '%s' from dictionary", data.avp_name); + return false; + } + if (data.avp_code != existing_avp.avp_code +// || data.avp_vendor != existing_avp.avp_vendor +// || strcmp(data.avp_name, existing_avp.avp_name) != 0 +// || data.avp_flag_mask != existing_avp.avp_flag_mask + || data.avp_vendor != existing_avp.avp_vendor + || data.avp_basetype != existing_avp.avp_basetype) { + LOG_E("AVP with name '%s' but different properties already exists in dictionary (existing vs. new: Code: %d/%d, Flags: %x/%x, Vendor Id: %d/%d, Basetype: %d/%d)", data.avp_name, data.avp_code, existing_avp.avp_code, data.avp_flag_mask, existing_avp.avp_flag_mask, data.avp_vendor, existing_avp.avp_vendor, data.avp_basetype, existing_avp.avp_basetype); + return false; + } + } else if (fds_ret == ENOENT) { + switch(fd_dict_new(fd_g_config->cnf_dict, DICT_AVP, &data, type, NULL)) { + case 0: + LOG_D("Added AVP '%s' to dictionary", data.avp_name); + break; + case EINVAL: + LOG_E("error adding AVP '%s' to dictionary: invalid data", data.avp_name); + return false; + case EEXIST: + LOG_E("error adding AVP '%s' to dictionary: duplicate entry", data.avp_name); + return false; + default: + LOG_E("error adding AVP '%s' to dictionary: %s", data.avp_name, strerror(errno)); + return false; + } + } else { + LOG_E("error looking up AVP '%s' in dictionary: %s", data.avp_name, strerror(errno)); + return false; + } + + return true; +} + +static bool +add_avps(const Json::Value &config) +{ + Json::Value avps = config["AVPs"]; + if (avps == Json::Value::null) + return true; + for (Json::ArrayIndex i=0; icnf_dict, DICT_APPLICATION, APPLICATION_BY_NAME, (void *)application.asCString(), application_object, 0); + if (*application_object == NULL) { + LOG_E("Application '%s' not found", application.asCString()); + return false; + } + return true; +} + +static bool +add_commands(const Json::Value &config) +{ + Json::Value commands = config["Commands"]; + if (commands == Json::Value::null) + return true; + for (Json::ArrayIndex i=0; icnf_dict, DICT_COMMAND, &command_data, application_object, NULL)) != 0) { + LOG_E("error adding Command '%s' to dictionary: %s", commands[i]["Name"].asCString(), strerror(ret)); + return false; + } + } else { + if ((ret=fd_dict_new(fd_g_config->cnf_dict, DICT_COMMAND, &command_data, NULL, NULL)) != 0) { + LOG_E("error adding Command '%s' to dictionary: %s", commands[i]["Name"].asCString(), strerror(ret)); + return false; + } + } + LOG_D("Added Command '%s' to dictionary", commands[i]["Name"].asCString()); + } + + return true; +} + +static bool +look_up_avp(const Json::Value &avp, const Json::Value &vendor, struct dict_object **avp_object) +{ + if (vendor != Json::Value::null) { + struct dict_avp_request_ex dare; + memset(&dare, 0, sizeof(dare)); + if (vendor.isInt()) { + LOG_D("Looking for AVP '%s', Vendor %d", avp.asCString(), vendor.asInt()); + dare.avp_vendor.vendor_id = vendor.asUInt(); + } else if (vendor.isString()) { + LOG_D("Looking for AVP '%s', Vendor '%s'", avp.asCString(), vendor.asCString()); + dare.avp_vendor.vendor_name = vendor.asCString(); + } else { + LOG_E("error finding AVP '%s', invalid value for Vendor", avp.asCString()); + return false; + } + dare.avp_data.avp_name = avp.asCString(); + fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_STRUCT, &dare, avp_object, 0); + } else { + fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, (void *)avp.asCString(), avp_object, 0); + } + if (*avp_object == NULL) { + LOG_E("AVP '%s' not found", avp.asCString()); + return false; + } + return true; +} + +static bool +add_rule_entry(const Json::Value &rule, struct dict_object *parent) +{ + struct dict_rule_data data; + int ret; + + memset(&data, 0, sizeof(data)); + data.rule_min = -1; + if (rule["Min"] != Json::Value::null) { + if (rule["Min"].isInt()) + data.rule_min = rule["Min"].asInt(); + else if (rule["Min"].isString() && strcmp(rule["Min"].asCString(), "unbounded") == 0) + data.rule_min = -1; + else { + LOG_E("error adding rule with AVP '%s', invalid value for Min", rule["AVP"].asCString()); + } + data.rule_min = rule["Min"].asInt(); + } + if (data.rule_min > 0) { + data.rule_position = RULE_REQUIRED; + } else { + data.rule_position = RULE_OPTIONAL; + } + data.rule_max = -1; + if (rule["Max"] != Json::Value::null) { + if (rule["Max"].isInt()) + data.rule_max = rule["Max"].asInt(); + else if (rule["Max"].isString() && strcmp(rule["Max"].asCString(), "unbounded") == 0) + data.rule_max = -1; + else { + LOG_E("error adding rule with AVP '%s', invalid value for Max", rule["AVP"].asCString()); + return false; + } + } + if (rule["First"] == true) { + data.rule_position = RULE_FIXED_HEAD; + data.rule_order = 1; + } + + LOG_D("Looking up AVP '%s' for rule", rule["AVP"].asCString()); + if (!look_up_avp(rule["AVP"], rule["Vendor"], &data.rule_avp)) { + LOG_E("Adding rule: AVP '%s' not found", rule["AVP"].asCString()); + return false; + } + LOG_D("Found AVP '%s' for rule", rule["AVP"].asCString()); + if ((ret=fd_dict_new(fd_g_config->cnf_dict, DICT_RULE, &data, parent, NULL)) < 0) { + LOG_E("error adding rule with AVP '%s': %s", rule["AVP"].asCString(), strerror(ret)); + return false; + } + LOG_D("Added AVP '%s' to rule", rule["AVP"].asCString()); + return true; +} + + +static bool +add_command_rule(const Json::Value &rule) +{ + int ret; + struct dict_object *command; + + if ((ret=fd_dict_search(fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, rule["Command"].asCString(), &command, ENOENT)) < 0) { + LOG_E("Command '%s' not found in dictionary: %s", rule["Command"].asCString(), strerror(ret)); + return false; + } + + Json::Value content = rule["Content"]; + if (content == Json::Value::null) { + LOG_E("No rules for Command '%s'", rule["Command"].asCString()); + return false; + } + for (Json::ArrayIndex i=0; icnf_dict, DICT_TYPE, TYPE_BY_NAME, types[i]["Base"].asCString(), &base_type, ENOENT); + switch (ret) { + case 0: + if (fd_dict_getval(base_type, &base_data) < 0) { + LOG_E("Error looking up base type '%s' for type '%s'", types[i]["Base"].asCString(), types[i]["Name"].asCString()); + return false; + } + type_data.type_base = base_data.type_base; + break; + + case ENOENT: + /* not an extended type, perhaps a basic one? */ + ret = basic_type(types[i]["Base"].asString()); + if (ret != -1) { + type_data.type_base = (enum dict_avp_basetype)ret; + break; + } + /* fallthrough */ + + default: + /* not found, or error */ + LOG_E("Base type '%s' for type '%s' not found", types[i]["Base"].asCString(), types[i]["Name"].asCString()); + return false; + } + + type_data.type_name = (char *)(void *)types[i]["Name"].asCString(); + if ((ret=fd_dict_new(fd_g_config->cnf_dict, DICT_TYPE, &type_data, NULL, NULL)) != 0) { + LOG_E("error adding Type '%s' to dictionary: %s", types[i]["Name"].asCString(), strerror(ret)); + return false; + } + LOG_D("Added Type '%s' to dictionary", types[i]["Name"].asCString()); + } + + return true; +} + +static bool +add_vendors(const Json::Value &config) +{ + Json::Value vendors = config["Vendors"]; + if (vendors == Json::Value::null) + return true; + for (Json::ArrayIndex i=0; icnf_dict, DICT_VENDOR, &vendor_data, NULL, NULL)) != 0) { + LOG_E("error adding Vendor '%s' to dictionary: %s", vendors[i]["Name"].asCString(), strerror(ret)); + return false; + } + LOG_D("Added Vendor '%s' to dictionary", vendors[i]["Name"].asCString()); + } + + return true; +} + +static bool +parse_json_from_file(const char *conffile, Json::Value &jv) +{ + struct stat sb; + char *buf; + FILE *fp; + Json::Reader reader; + static Json::SchemaValidator *validator = NULL; + + if (conffile == NULL || stat(conffile, &sb) < 0 || !S_ISREG(sb.st_mode)) { + LOG_E("invalid or missing configuration: %s", conffile ?: "(null)"); + return false; + } + if ((buf=(char *)malloc(static_cast(sb.st_size + 1))) == NULL) { + LOG_E("malloc failure of %zu bytes", static_cast(sb.st_size)); + return false; + } + if ((fp=fopen(conffile, "r")) == NULL) { + LOG_E("error opening file '%s': %s", conffile, strerror(errno)); + return false; + } + if (fread(buf, static_cast(sb.st_size), 1, fp) != 1) { + LOG_E("error reading from file '%s': %s", conffile, strerror(errno)); + return false; + } + (void)fclose(fp); + + buf[sb.st_size] = '\0'; + + if (!reader.parse (buf, jv)) { + LOG_E("error parsing JSON data from file '%s': %s", conffile, reader.getFormattedErrorMessages().c_str()); + return false; + } + free(buf); + + if (validator == NULL) { + try { + validator = new Json::SchemaValidator(std::string(dict_json_dict_schema)); + } catch (Json::SchemaValidator::Exception &e) { + LOG_E("error creating JSON schema validator: %s", e.type_message().c_str()); + return false; + } + } + + if (!validator->validate(jv)) { + LOG_E("error validating config file %s:", conffile); + const std::vector &errors = validator->errors(); + for (std::vector::const_iterator it = errors.begin(); it != errors.end(); ++it) { + LOG_E(" %s:%s", it->path.c_str(), it->message.c_str()); + } + return false; + } + +#if 0 + Json::StyledWriter styledWriter; + std::cout << styledWriter.write(jv); +#endif + + return true; +} + +static bool +read_dictionary(const char *filename) +{ + Json::Value config = Json::Value::null; + if (!parse_json_from_file (filename, config)) { + LOG_E("error parsing JSON file"); + return false; + } + + if (!add_vendors(config)) { + LOG_E("error adding vendors"); + return false; + } + if (!add_types(config)) { + LOG_E("error adding types"); + return false; + } + if (!add_avps(config)) { + LOG_E("error adding AVPs"); + return false; + } + if (!add_applications(config)) { + LOG_E("error adding applications"); + return false; + } + if (!add_commands(config)) { + LOG_E("error adding commands"); + return false; + } + if (!add_command_rules(config)) { + LOG_E("error adding command rules"); + return false; + } + if (!add_avp_rules(config)) { + LOG_E("error adding AVP rules"); + return false; + } + + return true; +} + +static int +dict_json_entry(char * conffile) +{ + Json::Value main_config = Json::Value::null; + char *filename, *filename_base, *p; + + TRACE_ENTRY("%p", conffile); + + filename_base = strdup(conffile); + if (filename_base == NULL) { + LOG_E("error initialising JSON dictionary extension: %s", strerror(errno)); + return 1; + } + filename = filename_base; + while ((p=strsep(&filename, ";")) != NULL) { + LOG_D("parsing dictionary '%s'", p); + if (!read_dictionary(p)) { + LOG_E("error reading JSON dictionary '%s'", p); + return EINVAL; + } + LOG_N("loaded JSON dictionary '%s'", p); + if (filename == NULL) + break; + } + + free(filename_base); + LOG_N("Extension 'Dictionary definitions from JSON dictionaries' initialized"); + return 0; +} + +extern "C" { + EXTENSION_ENTRY("dict_json", dict_json_entry); +} diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/dict_json/dict_json_dict_schema.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/dict_json/dict_json_dict_schema.cc Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,164 @@ +const char * dict_json_dict_schema = "\ +{ \n\ + \"definitions\": { \n\ + \"content\": { \n\ + \"type\": \"array\", \n\ + \"items\": { \n\ + \"type\": \"object\", \n\ + \"additionalProperties\": false, \n\ + \"required\": [ \"AVP\" ], \n\ + \"properties\": { \n\ + \"AVP\": { \"type\": \"string\" }, \n\ + \"Vendor\": { \"$ref\": \"#/definitions/unsigned-integer\" }, \n\ + \"First\": { \"type\": \"boolean\" }, \n\ + \"Min\": { \"$ref\": \"#/definitions/unsigned-integer\" }, \n\ + \"Max\": { \"anyOf\": [ { \"type\": \"integer\" }, { \"enum\": [ \"unbounded\" ] } ] } \n\ + } \n\ + } \n\ + }, \n\ + \n\ + \"identifier\": { \"type\": \"string\", \"pattern\": \"^[[:print:]]+$\" }, \n\ + \"type\": { \n\ + \"enum\": [ \n\ + \"Address\", \n\ + \"DiameterIdentity\", \n\ + \"DiameterURI\", \n\ + \"Enumerated\", \n\ + \"Float32\", \n\ + \"Float64\", \n\ + \"Grouped\", \n\ + \"Integer32\", \n\ + \"Integer64\", \n\ + \"IPFilterRule\", \n\ + \"OctetString\", \n\ + \"Time\", \n\ + \"Unsigned32\", \n\ + \"Unsigned64\", \n\ + \"UTF8String\" \n\ + ] \n\ + }, \n\ + \"unsigned-integer\": { \"type\": \"integer\", \"minimum\": 0 } \n\ + }, \n\ + \n\ + \"type\": \"object\", \n\ + \"additionalProperties\": false, \n\ + \"properties\": { \n\ + \"Vendors\": { \n\ + \"type\": \"array\", \n\ + \"items\": { \n\ + \"type\": \"object\", \n\ + \"additionalProperties\": false, \n\ + \"required\": [ \"Code\", \"Name\" ], \n\ + \"properties\": { \n\ + \"Code\": { \"$ref\": \"#/definitions/unsigned-integer\" }, \n\ + \"Name\": { \"$ref\": \"#/definitions/identifier\" } \n\ + } \n\ + } \n\ + }, \n\ + \"Types\": { \n\ + \"type\": \"array\", \n\ + \"items\": { \n\ + \"type\": \"object\", \n\ + \"additionalProperties\": false, \n\ + \"required\": [ \"Name\", \"Base\" ], \n\ + \"properties\": { \n\ + \"Name\": { \"type\": \"string\" }, \n\ + \"Base\": { \"type\": \"string\" } \n\ + } \n\ + } \n\ + }, \n\ + \"AVPs\": { \n\ + \"type\": \"array\", \n\ + \"items\": { \n\ + \"type\": \"object\", \n\ + \"additionalProperties\": false, \n\ + \"required\": [ \"Code\", \"Name\", \"Type\" ], \n\ + \"properties\": { \n\ + \"Code\": { \"$ref\": \"#/definitions/unsigned-integer\" }, \n\ + \"Vendor\": { \"$ref\": \"#/definitions/unsigned-integer\" }, \n\ + \"Name\": { \"$ref\": \"#/definitions/identifier\" }, \n\ + \"Flags\": { \n\ + \"type\": \"object\", \n\ + \"additionalProperties\": false, \n\ + \"properties\": { \n\ + \"Must\": { \"type\": \"string\", \"pattern\": \"^[VMP]*$\" }, \n\ + \"MustNot\": { \"type\": \"string\", \"pattern\": \"^[VMP]*$\" } \n\ + } \n\ + }, \n\ + \"Type\": { \"$ref\": \"#/definitions/identifier\" }, \n\ + \"EnumValues\": { \n\ + \"type\": \"array\", \n\ + \"items\": { \n\ + \"type\": \"object\", \n\ + \"additionalProperties\": false, \n\ + \"required\": [ \"Code\", \"Name\" ], \n\ + \"properties\": { \n\ + \"Code\": { \"anyOf\": [ { \"type\": \"integer\" }, { \"type\": \"number\" }, { \"type\": \"string\" } ] }, \n\ + \"Name\": { \"type\": \"string\", \"pattern\": \"^[[:print:]]*$\" } \n\ + } \n\ + } \n\ + } \n\ + } \n\ + } \n\ + }, \n\ + \"Applications\": { \n\ + \"type\": \"array\", \n\ + \"items\": { \n\ + \"type\": \"object\", \n\ + \"additionalProperties\": false, \n\ + \"required\": [ \"Code\", \"Name\" ], \n\ + \"properties\": { \n\ + \"Code\": { \"$ref\": \"#/definitions/unsigned-integer\" }, \n\ + \"Name\": { \"$ref\": \"#/definitions/identifier\" } \n\ + } \n\ + } \n\ + }, \n\ + \"Commands\": { \n\ + \"type\": \"array\", \n\ + \"items\": { \n\ + \"type\": \"object\", \n\ + \"additionalProperties\": false, \n\ + \"required\": [ \"Code\", \"Name\" ], \n\ + \"properties\": { \n\ + \"Code\": { \"$ref\": \"#/definitions/unsigned-integer\" }, \n\ + \"Name\": { \"$ref\": \"#/definitions/identifier\" }, \n\ + \"Application\": { \"$ref\": \"#/definitions/identifier\" }, \n\ + \"Flags\": { \n\ + \"type\": \"object\", \n\ + \"additionalProperties\": false, \n\ + \"properties\": { \n\ + \"Must\": { \"type\": \"string\", \"pattern\": \"^[RPE]*$\" }, \n\ + \"MustNot\": { \"type\": \"string\", \"pattern\": \"^[RPET]*$\" } \n\ + } \n\ + } \n\ + } \n\ + } \n\ + }, \n\ + \"CommandRules\": { \n\ + \"type\": \"array\", \n\ + \"items\": { \n\ + \"type\": \"object\", \n\ + \"additionalProperties\": false, \n\ + \"required\": [ \"Command\", \"Content\" ], \n\ + \"properties\": { \n\ + \"Command\": { \"type\": \"string\", \"minimum\": 0 }, \n\ + \"Content\": { \"$ref\": \"#/definitions/content\" } \n\ + } \n\ + } \n\ + }, \n\ + \"AVPRules\": { \n\ + \"type\": \"array\", \n\ + \"items\": { \n\ + \"type\": \"object\", \n\ + \"additionalProperties\": false, \n\ + \"required\": [ \"AVP\", \"Content\" ], \n\ + \"properties\": { \n\ + \"AVP\": { \"type\": \"string\" }, \n\ + \"Vendor\": { \"type\": \"integer\", \"minimum\" : 0 }, \n\ + \"Content\": { \"$ref\": \"#/definitions/content\" } \n\ + } \n\ + } \n\ + } \n\ + } \n\ +} \n\ +"; diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/dict_json/dict_json_dict_schema.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/dict_json/dict_json_dict_schema.json Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,162 @@ +{ + "definitions": { + "content": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ "AVP" ], + "properties": { + "AVP": { "type": "string" }, + "Vendor": { "$ref": "#/definitions/unsigned-integer" }, + "First": { "type": "boolean" }, + "Min": { "$ref": "#/definitions/unsigned-integer" }, + "Max": { "anyOf": [ { "type": "integer" }, { "enum": [ "unbounded" ] } ] } + } + } + }, + + "identifier": { "type": "string", "pattern": "^[[:print:]]+$" }, + "type": { + "enum": [ + "Address", + "DiameterIdentity", + "DiameterURI", + "Enumerated", + "Float32", + "Float64", + "Grouped", + "Integer32", + "Integer64", + "IPFilterRule", + "OctetString", + "Time", + "Unsigned32", + "Unsigned64", + "UTF8String" + ] + }, + "unsigned-integer": { "type": "integer", "minimum": 0 } + }, + + "type": "object", + "additionalProperties": false, + "properties": { + "Vendors": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ "Code", "Name" ], + "properties": { + "Code": { "$ref": "#/definitions/unsigned-integer" }, + "Name": { "$ref": "#/definitions/identifier" } + } + } + }, + "Types": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ "Name", "Base" ], + "properties": { + "Name": { "type": "string" }, + "Base": { "type": "string" } + } + } + }, + "AVPs": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ "Code", "Name", "Type" ], + "properties": { + "Code": { "$ref": "#/definitions/unsigned-integer" }, + "Vendor": { "$ref": "#/definitions/unsigned-integer" }, + "Name": { "$ref": "#/definitions/identifier" }, + "Flags": { + "type": "object", + "additionalProperties": false, + "properties": { + "Must": { "type": "string", "pattern": "^[VMP]*$" }, + "MustNot": { "type": "string", "pattern": "^[VMP]*$" } + } + }, + "Type": { "$ref": "#/definitions/identifier" }, + "EnumValues": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ "Code", "Name" ], + "properties": { + "Code": { "anyOf": [ { "type": "integer" }, { "type": "number" }, { "type": "string" } ] }, + "Name": { "type": "string", "pattern": "^[[:print:]]*$" } + } + } + } + } + } + }, + "Applications": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ "Code", "Name" ], + "properties": { + "Code": { "$ref": "#/definitions/unsigned-integer" }, + "Name": { "$ref": "#/definitions/identifier" } + } + } + }, + "Commands": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ "Code", "Name" ], + "properties": { + "Code": { "$ref": "#/definitions/unsigned-integer" }, + "Name": { "$ref": "#/definitions/identifier" }, + "Application": { "$ref": "#/definitions/identifier" }, + "Flags": { + "type": "object", + "additionalProperties": false, + "properties": { + "Must": { "type": "string", "pattern": "^[RPE]*$" }, + "MustNot": { "type": "string", "pattern": "^[RPET]*$" } + } + } + } + } + }, + "CommandRules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ "Command", "Content" ], + "properties": { + "Command": { "type": "string", "minimum": 0 }, + "Content": { "$ref": "#/definitions/content" } + } + } + }, + "AVPRules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ "AVP", "Content" ], + "properties": { + "AVP": { "type": "string" }, + "Vendor": { "type": "integer", "minimum" : 0 }, + "Content": { "$ref": "#/definitions/content" } + } + } + } + } +} diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/rt_default/rt_default.c --- a/extensions/rt_default/rt_default.c Sun Jan 21 22:25:07 2018 +0800 +++ b/extensions/rt_default/rt_default.c Sun May 12 23:15:40 2019 +0800 @@ -37,38 +37,101 @@ * Configurable routing of messages for freeDiameter. */ +#include + #include "rt_default.h" +#define MODULE_NAME "rt_default" + +#include + +static pthread_rwlock_t rtd_lock; + +static char *rtd_config_file; + /* The callback called on new messages */ static int rtd_out(void * cbdata, struct msg ** pmsg, struct fd_list * candidates) { struct msg * msg = *pmsg; TRACE_ENTRY("%p %p %p", cbdata, msg, candidates); + int ret; CHECK_PARAMS(msg && candidates); - + + if (pthread_rwlock_rdlock(&rtd_lock) != 0) { + fd_log_notice("%s: read-lock failed, skipping handler", MODULE_NAME); + return 0; + } /* Simply pass it to the appropriate function */ if (FD_IS_LIST_EMPTY(candidates)) { - return 0; + ret = 0; } else { - return rtd_process( msg, candidates ); + ret = rtd_process( msg, candidates ); } + if (pthread_rwlock_unlock(&rtd_lock) != 0) { + fd_log_notice("%s: read-unlock failed after rtd_out, exiting", MODULE_NAME); + exit(1); + } + return ret; } /* handler */ static struct fd_rt_out_hdl * rtd_hdl = NULL; +static volatile int in_signal_handler = 0; + +/* signal handler */ +static void sig_hdlr(void) +{ + if (in_signal_handler) { + fd_log_error("%s: already handling a signal, ignoring new one", MODULE_NAME); + return; + } + in_signal_handler = 1; + + if (pthread_rwlock_wrlock(&rtd_lock) != 0) { + fd_log_error("%s: locking failed, aborting config reload", MODULE_NAME); + return; + } + rtd_conf_reload(rtd_config_file); + if (pthread_rwlock_unlock(&rtd_lock) != 0) { + fd_log_error("%s: unlocking failed after config reload, exiting", MODULE_NAME); + exit(1); + } + + fd_log_notice("%s: reloaded configuration", MODULE_NAME); + + in_signal_handler = 0; +} + + /* entry point */ static int rtd_entry(char * conffile) { TRACE_ENTRY("%p", conffile); - + + rtd_config_file = conffile; + pthread_rwlock_init(&rtd_lock, NULL); + + if (pthread_rwlock_wrlock(&rtd_lock) != 0) { + fd_log_notice("%s: write-lock failed, aborting", MODULE_NAME); + return EDEADLK; + } + /* Initialize the repo */ CHECK_FCT( rtd_init() ); /* Parse the configuration file */ CHECK_FCT( rtd_conf_handle(conffile) ); - + + if (pthread_rwlock_unlock(&rtd_lock) != 0) { + fd_log_notice("%s: write-unlock failed, aborting", MODULE_NAME); + return EDEADLK; + } + + /* Register reload callback */ + CHECK_FCT(fd_event_trig_regcb(SIGUSR1, MODULE_NAME, sig_hdlr)); + #if 0 /* Dump the rules */ rtd_dump(); @@ -91,9 +154,11 @@ /* Destroy the data */ rtd_fini(); - + + pthread_rwlock_destroy(&rtd_lock); + /* Done */ return ; } -EXTENSION_ENTRY("rt_default", rtd_entry); +EXTENSION_ENTRY(MODULE_NAME, rtd_entry); diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/rt_default/rt_default.h --- a/extensions/rt_default/rt_default.h Sun Jan 21 22:25:07 2018 +0800 +++ b/extensions/rt_default/rt_default.h Sun May 12 23:15:40 2019 +0800 @@ -82,5 +82,8 @@ /* Process a message & peer list through the rules repository, updating the scores */ int rtd_process( struct msg * msg, struct fd_list * candidates ); +/* Reload the config file */ +void rtd_conf_reload(char *config_file); + /* For debug: dump the rule repository */ void rtd_dump(void); diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/rt_default/rtd_conf.y --- a/extensions/rt_default/rtd_conf.y Sun Jan 21 22:25:07 2018 +0800 +++ b/extensions/rt_default/rtd_conf.y Sun May 12 23:15:40 2019 +0800 @@ -54,6 +54,7 @@ /* Forward declaration */ int yyparse(char * conffile); +void rtd_confrestart(FILE *input_file); static int rules_added = 0; @@ -65,25 +66,27 @@ TRACE_ENTRY("%p", conffile); - TRACE_DEBUG (FULL, "Parsing configuration file: %s...", conffile); - + TRACE_DEBUG (FULL, "rt_default: Parsing configuration file: %s...", conffile); + + rules_added = 0; rtd_confin = fopen(conffile, "r"); if (rtd_confin == NULL) { ret = errno; fd_log_debug("Unable to open extension configuration file %s for reading: %s", conffile, strerror(ret)); - TRACE_DEBUG (INFO, "Error occurred, message logged -- configuration file."); + TRACE_DEBUG (INFO, "rt_default: Error occurred, message logged -- configuration file."); return ret; } + rtd_confrestart(rtd_confin); ret = yyparse(conffile); fclose(rtd_confin); if (ret != 0) { - TRACE_DEBUG (INFO, "Unable to parse the configuration file."); + TRACE_DEBUG (INFO, "rt_default: Unable to parse the configuration file."); return EINVAL; } else { - TRACE_DEBUG(FULL, "Added %d RULES routing entries successfully.", rules_added); + TRACE_DEBUG(INFO, "rt_default: Added %d RULES routing entries successfully.", rules_added); } return 0; @@ -95,7 +98,7 @@ /* Function to report the errors */ void yyerror (YYLTYPE *ploc, char * conffile, char const *s) { - TRACE_DEBUG(INFO, "Error in configuration parsing"); + TRACE_DEBUG(INFO, "rt_default: 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); diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/rt_default/rtd_rules.c --- a/extensions/rt_default/rtd_rules.c Sun Jan 21 22:25:07 2018 +0800 +++ b/extensions/rt_default/rtd_rules.c Sun May 12 23:15:40 2019 +0800 @@ -46,7 +46,7 @@ * * Under each TARGET element, we have the list of RULES that are defined for this target, ordered by CRITERIA type, then is_regex, then string value. * - * Note: Except during configuration parsing and module termination, the lists are only ever accessed read-only, so we do not need a lock. + * Note: Access these only when holding rtd_lock; config reload may change the underlying data. */ /* Structure to hold the data that is used for matching. */ @@ -389,19 +389,23 @@ return 0; } -/* Destroy the module's data */ -void rtd_fini(void) +static void free_targets(void) { int i; - - TRACE_ENTRY(); for (i = 0; i < RTD_TAR_MAX; i++) { while (!FD_IS_LIST_EMPTY(&TARGETS[i])) { del_target((struct target *) TARGETS[i].next); } } - +} + +/* Destroy the module's data */ +void rtd_fini(void) +{ + TRACE_ENTRY(); + + free_targets(); } /* Add a new rule in the repository. this is called when the configuration file is being parsed */ @@ -494,6 +498,40 @@ return 0; } +void rtd_conf_reload(char *config_file) +{ + /* save old config in case reload goes wrong */ + struct fd_list old_config[RTD_TAR_MAX]; + int i; + + for (i = 0; i < RTD_TAR_MAX; i++) { + old_config[i] = TARGETS[i]; + } + memset(TARGETS, 0, sizeof(*TARGETS) * RTD_TAR_MAX); + for (i = 0; i < RTD_TAR_MAX; i++) { + fd_list_init(&TARGETS[i], NULL); + } + + if (rtd_conf_handle(config_file) != 0) { + fd_log_notice("rt_default: error reloading configuration, restoring previous configuration"); + free_targets(); + for (i = 0; i < RTD_TAR_MAX; i++) { + TARGETS[i] = old_config[i]; + } + } else { + /* this has to be done in this weird way because the items contain back pointers referencing TARGETS */ + struct fd_list save_config[RTD_TAR_MAX]; + for (i = 0; i < RTD_TAR_MAX; i++) { + save_config[i] = TARGETS[i]; + TARGETS[i] = old_config[i]; + } + free_targets(); + for (i = 0; i < RTD_TAR_MAX; i++) { + TARGETS[i] = save_config[i]; + } + } +} + /* Check if a message and list of eligible candidate match any of our rules, and update its score according to it. */ int rtd_process( struct msg * msg, struct fd_list * candidates ) { diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/rt_deny_by_size/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/rt_deny_by_size/CMakeLists.txt Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,29 @@ +# The rt_deny_by_size extension +PROJECT("Routing extension to deny messages that are over a particular size" C) + +# Parser files +BISON_FILE(rt_deny_by_size_conf.y) +FLEX_FILE(rt_deny_by_size_conf.l) +SET_SOURCE_FILES_PROPERTIES(lex.rt_deny_by_size_conf.c rt_deny_by_size_conf.tab.c PROPERTIES COMPILE_FLAGS "-I ${CMAKE_CURRENT_SOURCE_DIR}") + +# List of source files +SET( RT_DENY_BY_SIZE_SRC + rt_deny_by_size.c + rt_deny_by_size.h + lex.rt_deny_by_size_conf.c + rt_deny_by_size_conf.tab.c + rt_deny_by_size_conf.tab.h +) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) + +# Compile these files as a freeDiameter extension +FD_ADD_EXTENSION(rt_deny_by_size ${RT_DENY_BY_SIZE_SRC}) + +#### +## INSTALL section ## + +# We install with the daemon component because it is a base feature. +INSTALL(TARGETS rt_deny_by_size + LIBRARY DESTINATION ${INSTALL_EXTENSIONS_SUFFIX} + COMPONENT freeDiameter-daemon) diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/rt_deny_by_size/rt_deny_by_size.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/rt_deny_by_size/rt_deny_by_size.c Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,122 @@ +/********************************************************************************************************* +* Software License Agreement (BSD License) * +* Author: Thomas Klausner * +* * +* Copyright (c) 2018, Thomas Klausner * +* All rights reserved. * +* * +* Written under contract by Effortel Technologies SA, http://effortel.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. * +* * +* * 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. * +*********************************************************************************************************/ + +#include + +/* See doc/rt_deny_by_size.conf.sample for more details about the features of this extension */ +#include "rt_deny_by_size.h" + +/* The configuration structure */ +struct rt_deny_by_size_conf rt_deny_by_size_conf; + +static struct fd_rt_fwd_hdl * rt__deny_by_size_hdl = NULL; +static char *config_file = NULL; +#define MODULE_NAME "rt_deny_by_size" +#define DEFAULT_MAX_SIZE 4096; + +/* the routing callback that handles all the tasks of this extension */ +static int rt_deny_by_size_fwd_cb(void * cbdata, struct msg ** pmsg) +{ + struct msg_hdr * hdr; + + /* Get the header of the message */ + CHECK_FCT(fd_msg_hdr(*pmsg, &hdr)); + + if (hdr->msg_length > rt_deny_by_size_conf.maximum_size) { + if (hdr->msg_flags & CMD_FLAG_REQUEST) { + /* Create an answer */ + CHECK_FCT(fd_msg_new_answer_from_req(fd_g_config->cnf_dict, pmsg, MSGFL_ANSW_ERROR)); + CHECK_FCT(fd_msg_rescode_set(*pmsg, "DIAMETER_UNABLE_TO_COMPLY", "[rt_deny_by_size] Message is too big", NULL, 2)); + CHECK_FCT( fd_msg_send(pmsg, NULL, NULL) ); + } + } + + return 0; +} + +static void sig_hdlr(void) +{ + int old_maximum_size; + + old_maximum_size = rt_deny_by_size_conf.maximum_size; + if (rt_deny_by_size_conf_handle(config_file) != 0) { + fd_log_error("%s: error during config file reload, restoring previous value", MODULE_NAME); + rt_deny_by_size_conf.maximum_size = old_maximum_size; + } + fd_log_notice("%s: reloaded configuration, maximum size now %d", MODULE_NAME, rt_deny_by_size_conf.maximum_size); +} + +/* entry point */ +static int rt_deny_by_size_entry(char * conffile) +{ + TRACE_ENTRY("%p", conffile); + + config_file = conffile; + /* Initialize the configuration */ + memset(&rt_deny_by_size_conf, 0, sizeof(rt_deny_by_size_conf)); + rt_deny_by_size_conf.maximum_size = DEFAULT_MAX_SIZE; + + /* Parse the configuration file */ + CHECK_FCT(rt_deny_by_size_conf_handle(config_file)); + + /* Register the callback */ + CHECK_FCT(fd_rt_fwd_register(rt_deny_by_size_fwd_cb, NULL, RT_FWD_REQ, &rt__deny_by_size_hdl)); + + /* Register reload callback */ + CHECK_FCT(fd_event_trig_regcb(SIGUSR1, MODULE_NAME, sig_hdlr)); + + fd_log_notice("Extension 'Deny by size' initialized with maximum size %d", rt_deny_by_size_conf.maximum_size); + + /* We're done */ + return 0; +} + +/* Unload */ +void fd_ext_fini(void) +{ + TRACE_ENTRY(); + + /* Unregister the cb */ + if (rt__deny_by_size_hdl) { + CHECK_FCT_DO(fd_rt_fwd_unregister(rt__deny_by_size_hdl, NULL), /* continue */); + } + + /* Done */ + return ; +} + +EXTENSION_ENTRY(MODULE_NAME, rt_deny_by_size_entry); diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/rt_deny_by_size/rt_deny_by_size.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/rt_deny_by_size/rt_deny_by_size.h Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,53 @@ +/********************************************************************************************************* +* Software License Agreement (BSD License) * +* Author: Thomas Klausner * +* * +* Copyright (c) 2018, Thomas Klausner * +* All rights reserved. * +* * +* Written under contract by Effortel Technologies SA, http://effortel.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. * +* * +* * 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. * +*********************************************************************************************************/ + +/* + * See the rt_deny_by_size.conf.sample file for the format of the configuration file. + */ + +/* FreeDiameter's common include file */ +#include + + +/* Parse the configuration file */ +int rt_deny_by_size_conf_handle(char * conffile); + +/* The configuration structure */ +extern struct rt_deny_by_size_conf { + int maximum_size; +} rt_deny_by_size_conf; + diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/rt_deny_by_size/rt_deny_by_size_conf.l --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/rt_deny_by_size/rt_deny_by_size_conf.l Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,107 @@ +/********************************************************************************************************* +* Software License Agreement (BSD License) * +* Authors: Thomas Klausner based on code by Sebastien Decugis * +* * +* Copyright (c) 2018, Thomas Klausner * +* Copyright (c) 2013, WIDE Project and NICT * +* All rights reserved. * +* * +* Written under contract by Effortel Technologies SA, http://effortel.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. * +* * +* * 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. * +*********************************************************************************************************/ + +/* Tokenizer + * + */ + +%{ +#include "rt_deny_by_size.h" +#include "rt_deny_by_size_conf.tab.h" + +/* Update the column information */ +#define YY_USER_ACTION { \ + yylloc->first_column = yylloc->last_column + 1; \ + yylloc->last_column = yylloc->first_column + yyleng - 1; \ +} + +/* Avoid warning with newer flex */ +#define YY_NO_INPUT + +%} + +qstring \"[^\"\n]*\" + + +%option bison-bridge bison-locations +%option noyywrap +%option nounput + +%% + + /* Update the line count */ +\n { + yylloc->first_line++; + yylloc->last_line++; + yylloc->last_column=0; + } + + /* Eat all spaces but not new lines */ +([[:space:]]{-}[\n])+ ; + /* Eat all comments */ +#.*$ ; + + /* Recognize any integer */ +[-]?[[:digit:]]+ { + /* Convert this to an integer value */ + int ret=0; + ret = sscanf(yytext, "%i", &yylval->integer); + if (ret != 1) { + /* No matching: an error occurred */ + TRACE_ERROR("Unable to convert the value '%s' to a valid number: %s", yytext, strerror(errno)); + return LEX_ERROR; /* trig an error in yacc parser */ + /* Maybe we could REJECT instead of failing here? */ + } + return INTEGER; + } + + + + /* The key words */ +(?i:"MaximumSize") { return MAXIMUMSIZE; } + + /* Valid single characters for yyparse */ +[=;] { return yytext[0]; } + + /* Unrecognized sequence, if it did not match any previous pattern */ +[^[:space:]=;\n]+ { + TRACE_ERROR("Unrecognized text on line %d col %d: '%s'.", yylloc->first_line, yylloc->first_column, yytext); + return LEX_ERROR; + } + +%% diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/rt_deny_by_size/rt_deny_by_size_conf.y --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/rt_deny_by_size/rt_deny_by_size_conf.y Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,147 @@ +/********************************************************************************************************* +* Software License Agreement (BSD License) * +* Author: Thomas Klausner * +* * +* Copyright (c) 2018, Thomas Klausner * +* All rights reserved. * +* * +* Written under contract by Effortel Technologies SA, http://effortel.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. * +* * +* * 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. * +*********************************************************************************************************/ + +/* Yacc extension's configuration parser. + */ + +/* For development only : */ +%debug +%error-verbose + +/* The parser receives the configuration file filename as parameter */ +%parse-param {char * conffile} + +/* Keep track of location */ +%locations +%pure-parser + +%{ +#include "rt_deny_by_size.h" +#include "rt_deny_by_size_conf.tab.h" + +/* Forward declaration */ +int rt_deny_by_size_confparse(char *conffile); +void rt_deny_by_size_confrestart(FILE *input_file); + +/* Parse the configuration file */ +int rt_deny_by_size_conf_handle(char * conffile) +{ + extern FILE *rt_deny_by_size_confin; + int ret; + + TRACE_ENTRY("%p", conffile); + + TRACE_DEBUG(FULL, "Parsing configuration file: %s...", conffile); + + rt_deny_by_size_confin = fopen(conffile, "r"); + if (rt_deny_by_size_confin == NULL) { + ret = errno; + TRACE_ERROR("Unable to open extension configuration file %s for reading: %s", conffile, strerror(ret)); + return ret; + } + + rt_deny_by_size_confrestart(rt_deny_by_size_confin); + ret = rt_deny_by_size_confparse(conffile); + + fclose(rt_deny_by_size_confin); + + if (ret != 0) { + 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); + } + + return 0; +} + +/* The Lex parser prototype */ +int rt_deny_by_size_conflex(YYSTYPE *lvalp, YYLTYPE *llocp); + +/* Function to report the errors */ +void yyerror (YYLTYPE *ploc, char * conffile, char const *s) +{ + TRACE_DEBUG(INFO, "Error in configuration parsing"); + + if (ploc->first_line != ploc->last_line) + fd_log_error("%s:%d.%d-%d.%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_line, ploc->last_column, s); + else if (ploc->first_column != ploc->last_column) + fd_log_error("%s:%d.%d-%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_column, s); + else + fd_log_error("%s:%d.%d : %s", conffile, ploc->first_line, ploc->first_column, s); +} + +%} + +/* Values returned by lex for token */ +%union { + int integer; +} + +/* In case of error in the lexical analysis */ +%token LEX_ERROR + +/* A (de)quoted string (malloc'd in lex parser; it must be freed after use) */ +%token INTEGER + +/* Tokens */ +%token MAXIMUMSIZE + + +/* -------------------------------------- */ +%% + + /* The grammar definition */ +conffile: /* empty is OK */ + | conffile size + | conffile errors + { + yyerror(&yylloc, conffile, "An error occurred while parsing the configuration file"); + YYABORT; + } + ; + + /* Lexical or syntax error */ +errors: LEX_ERROR + | error + ; + +size: MAXIMUMSIZE '=' INTEGER ';' + { + rt_deny_by_size_conf.maximum_size=$3; + } + ; diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/rt_ereg/rtereg.c --- a/extensions/rt_ereg/rtereg.c Sun Jan 21 22:25:07 2018 +0800 +++ b/extensions/rt_ereg/rtereg.c Sun May 12 23:15:40 2019 +0800 @@ -33,16 +33,26 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * *********************************************************************************************************/ -/* +/* * This extension allows to perform some pattern-matching on an AVP * and send the message to a server accordingly. * See rt_ereg.conf.sample file for the format of the configuration file. */ +#include +#include + #include "rtereg.h" +static pthread_rwlock_t rte_lock; + +#define MODULE_NAME "rt_ereg" + +static char *rt_ereg_config_file; + /* The configuration structure */ -struct rtereg_conf rtereg_conf; +struct rtereg_conf *rtereg_conf; +int rtereg_conf_size; #ifndef HAVE_REG_STARTEND static char * buf = NULL; @@ -50,18 +60,41 @@ static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; #endif /* HAVE_REG_STARTEND */ -static int proceed(char * value, size_t len, struct fd_list * candidates) +static int rtereg_init(void); +static int rtereg_init_config(void); +static void rtereg_fini(void); + +void rtereg_conf_free(struct rtereg_conf *config_struct, int config_size) +{ + int i, j; + + /* Destroy the data */ + for (j=0; jpattern); - + #ifdef HAVE_REG_STARTEND { regmatch_t pmatch[1]; @@ -76,10 +109,10 @@ err = regexec(&r->preg, value, 0, NULL, 0); } #endif /* HAVE_REG_STARTEND */ - + if (err == REG_NOMATCH) continue; - + if (err != 0) { char * errstr; size_t bl; @@ -99,10 +132,10 @@ /* Free the buffer, return the error */ free(errstr); - + return (err == REG_ESPACE) ? ENOMEM : EINVAL; } - + /* From this point, the expression matched the AVP value */ TRACE_DEBUG(FULL, "[rt_ereg] Match: '%s' to value '%.*s' => '%s' += %d", r->pattern, @@ -110,7 +143,7 @@ value, r->server, r->score); - + for (c = candidates->next; c != candidates; c = c->next) { struct rtd_candidate * cand = (struct rtd_candidate *)c; @@ -120,106 +153,240 @@ } } }; - + + return 0; +} + +static int find_avp(msg_or_avp *where, int conf_index, int level, struct fd_list * candidates) +{ + struct dict_object *what; + struct dict_avp_data dictdata; + struct avp *nextavp = NULL; + struct avp_hdr *avp_hdr = NULL; + + /* iterate over all AVPs and try to find a match */ +// for (i = 0; i rtereg_conf[conf_index].level) { + TRACE_DEBUG(INFO, "internal error, dug too deep"); + return 1; + } + what = rtereg_conf[conf_index].avps[level]; + + CHECK_FCT(fd_dict_getval(what, &dictdata)); + CHECK_FCT(fd_msg_browse(where, MSG_BRW_FIRST_CHILD, (void *)&nextavp, NULL)); + while (nextavp) { + 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); + 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); + if (avp_hdr->avp_value != NULL) { +#ifndef HAVE_REG_STARTEND + int ret; + + /* Lock the buffer */ + CHECK_POSIX( pthread_mutex_lock(&mtx) ); + + /* 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), + { pthread_mutex_unlock(&mtx); return ENOMEM; } ); + } + + /* Copy the AVP value */ + memcpy(buf, avp_hdr->avp_value->os.data, avp_hdr->avp_value->os.len); + buf[avp_hdr->avp_value->os.len] = '\0'; + + /* Now apply the rules */ + ret = proceed(buf, avp_hdr->avp_value->os.len, candidates, conf_index); + + CHECK_POSIX(pthread_mutex_unlock(&mtx)); + + CHECK_FCT(ret); +#else /* HAVE_REG_STARTEND */ + CHECK_FCT( proceed((char *) avp_hdr->avp_value->os.data, avp_hdr->avp_value->os.len, candidates, conf_index) ); +#endif /* HAVE_REG_STARTEND */ + } + } + } + CHECK_FCT(fd_msg_browse(nextavp, MSG_BRW_NEXT, (void *)&nextavp, NULL)); + } + return 0; } /* The callback called on new messages */ static int rtereg_out(void * cbdata, struct msg ** pmsg, struct fd_list * candidates) { - struct msg * msg = *pmsg; - struct avp * avp = NULL; - - 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)) { + msg_or_avp *where; + int j, ret; + + TRACE_ENTRY("%p %p %p", cbdata, *pmsg, candidates); + + CHECK_PARAMS(pmsg && *pmsg && candidates); + + if (pthread_rwlock_rdlock(&rte_lock) != 0) { + fd_log_notice("%s: read-lock failed, skipping handler", MODULE_NAME); return 0; } - - /* Now search the AVP in the message */ - CHECK_FCT( fd_msg_search_avp ( msg, rtereg_conf.avp, &avp ) ); - if (avp != NULL) { - struct avp_hdr * ahdr = NULL; - CHECK_FCT( fd_msg_avp_hdr ( avp, &ahdr ) ); - if (ahdr->avp_value != NULL) { -#ifndef HAVE_REG_STARTEND - int ret; - - /* Lock the buffer */ - CHECK_POSIX( pthread_mutex_lock(&mtx) ); - - /* Augment the buffer if needed */ - if (ahdr->avp_value->os.len >= bufsz) { - CHECK_MALLOC_DO( buf = realloc(buf, ahdr->avp_value->os.len + 1), - { pthread_mutex_unlock(&mtx); return ENOMEM; } ); + ret = 0; + /* Check if it is worth processing the message */ + if (!FD_IS_LIST_EMPTY(candidates)) { + /* Now search the AVPs in the message */ + + for (j=0; javp_value->os.data, ahdr->avp_value->os.len); - buf[ahdr->avp_value->os.len] = '\0'; - - /* Now apply the rules */ - ret = proceed(buf, ahdr->avp_value->os.len, candidates); - - CHECK_POSIX(pthread_mutex_unlock(&mtx)); - - CHECK_FCT(ret); -#else /* HAVE_REG_STARTEND */ - CHECK_FCT( proceed((char *) ahdr->avp_value->os.data, ahdr->avp_value->os.len, candidates) ); -#endif /* HAVE_REG_STARTEND */ } } - - return 0; + if (pthread_rwlock_unlock(&rte_lock) != 0) { + fd_log_notice("%s: read-unlock failed after rtereg_out, exiting", MODULE_NAME); + exit(1); + } + + return ret; } /* handler */ static struct fd_rt_out_hdl * rtereg_hdl = NULL; +static volatile int in_signal_handler = 0; + +/* signal handler */ +static void sig_hdlr(void) +{ + struct rtereg_conf *old_config; + int old_config_size; + + if (in_signal_handler) { + fd_log_error("%s: already handling a signal, ignoring new one", MODULE_NAME); + return; + } + in_signal_handler = 1; + + if (pthread_rwlock_wrlock(&rte_lock) != 0) { + fd_log_error("%s: locking failed, aborting config reload", MODULE_NAME); + return; + } + + /* save old config in case reload goes wrong */ + old_config = rtereg_conf; + old_config_size = rtereg_conf_size; + rtereg_conf = NULL; + rtereg_conf_size = 0; + + if (rtereg_init_config() != 0) { + fd_log_notice("%s: error reloading configuration, restoring previous configuration", MODULE_NAME); + rtereg_conf = old_config; + rtereg_conf_size = old_config_size; + } else { + rtereg_conf_free(old_config, old_config_size); + } + + if (pthread_rwlock_unlock(&rte_lock) != 0) { + fd_log_error("%s: unlocking failed after config reload, exiting", MODULE_NAME); + exit(1); + } + + fd_log_notice("%s: reloaded configuration, %d AVP group%s defined", MODULE_NAME, rtereg_conf_size, rtereg_conf_size != 1 ? "s" : ""); + + in_signal_handler = 0; +} + /* entry point */ static int rtereg_entry(char * conffile) { TRACE_ENTRY("%p", conffile); - + + rt_ereg_config_file = conffile; + + if (rtereg_init() != 0) { + return 1; + } + + /* Register reload callback */ + CHECK_FCT(fd_event_trig_regcb(SIGUSR1, MODULE_NAME, sig_hdlr)); + + fd_log_notice("%s: configured, %d AVP group%s defined", MODULE_NAME, rtereg_conf_size, rtereg_conf_size != 1 ? "s" : ""); + + return 0; +} + +static int rtereg_init_config(void) +{ /* Initialize the configuration */ - memset(&rtereg_conf, 0, sizeof(rtereg_conf)); - + if ((rtereg_conf=malloc(sizeof(*rtereg_conf))) == NULL) { + TRACE_DEBUG(INFO, "malloc failured"); + return 1; + } + rtereg_conf_size = 1; + memset(rtereg_conf, 0, sizeof(*rtereg_conf)); + /* Parse the configuration file */ - CHECK_FCT( rtereg_conf_handle(conffile) ); - + CHECK_FCT( rtereg_conf_handle(rt_ereg_config_file) ); + + return 0; +} + + +/* Load */ +static int rtereg_init(void) +{ + int ret; + + pthread_rwlock_init(&rte_lock, NULL); + + if (pthread_rwlock_wrlock(&rte_lock) != 0) { + fd_log_notice("%s: write-lock failed, aborting", MODULE_NAME); + return EDEADLK; + } + + if ((ret=rtereg_init_config()) != 0) { + pthread_rwlock_unlock(&rte_lock); + return ret; + } + + if (pthread_rwlock_unlock(&rte_lock) != 0) { + fd_log_notice("%s: write-unlock failed, aborting", MODULE_NAME); + return EDEADLK; + } + /* Register the callback */ CHECK_FCT( fd_rt_out_register( rtereg_out, NULL, 1, &rtereg_hdl ) ); - + /* We're done */ return 0; } /* Unload */ -void fd_ext_fini(void) +static void rtereg_fini(void) { - int i; TRACE_ENTRY(); - + /* Unregister the cb */ CHECK_FCT_DO( fd_rt_out_unregister ( rtereg_hdl, NULL ), /* continue */ ); - + /* Destroy the data */ - if (rtereg_conf.rules) - for (i = 0; i < rtereg_conf.rules_nb; i++) { - free(rtereg_conf.rules[i].pattern); - free(rtereg_conf.rules[i].server); - regfree(&rtereg_conf.rules[i].preg); - } - free(rtereg_conf.rules); + rtereg_conf_free(rtereg_conf, rtereg_conf_size); + rtereg_conf = NULL; + rtereg_conf_size = 0; #ifndef HAVE_REG_STARTEND free(buf); + buf = NULL; #endif /* HAVE_REG_STARTEND */ - + /* Done */ return ; } -EXTENSION_ENTRY("rt_ereg", rtereg_entry); +void fd_ext_fini(void) +{ + rtereg_fini(); +} + +EXTENSION_ENTRY(MODULE_NAME, rtereg_entry); diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/rt_ereg/rtereg.h --- a/extensions/rt_ereg/rtereg.h Sun Jan 21 22:25:07 2018 +0800 +++ b/extensions/rt_ereg/rtereg.h Sun May 12 23:15:40 2019 +0800 @@ -57,8 +57,11 @@ extern struct rtereg_conf { int rules_nb; /* Number of rules in the configuration */ struct rtereg_rule *rules; /* The array of rules */ - - struct dict_object * avp; /* cache the dictionary object that we are searching */ + + int level; /* how many levels of AVPs we have to dig down into */ + int finished; /* AVP fully configured, for configuration file reading */ + struct dict_object **avps; /* cache the dictionary objects that we are searching */ -} rtereg_conf; +} *rtereg_conf; +extern int rtereg_conf_size; diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/rt_ereg/rtereg_conf.y --- a/extensions/rt_ereg/rtereg_conf.y Sun Jan 21 22:25:07 2018 +0800 +++ b/extensions/rt_ereg/rtereg_conf.y Sun May 12 23:15:40 2019 +0800 @@ -37,14 +37,14 @@ */ /* For development only : */ -%debug +%debug %error-verbose /* The parser receives the configuration file filename as parameter */ %parse-param {char * conffile} /* Keep track of location */ -%locations +%locations %pure-parser %{ @@ -53,36 +53,91 @@ /* Forward declaration */ int yyparse(char * conffile); +void rtereg_confrestart(FILE *input_file); /* Parse the configuration file */ int rtereg_conf_handle(char * conffile) { extern FILE * rtereg_confin; int ret; - + TRACE_ENTRY("%p", conffile); - + TRACE_DEBUG (FULL, "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, "Error occurred, message logged -- configuration file."); + TRACE_DEBUG (INFO, "rt_ereg: error occurred, message logged -- configuration file."); return ret; } + rtereg_confrestart(rtereg_confin); ret = yyparse(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"); + return EINVAL; + } + if (ret != 0) { - TRACE_DEBUG (INFO, "Unable to parse the configuration file."); + TRACE_DEBUG(INFO, "rt_ereg: unable to parse the configuration file."); return EINVAL; } else { - TRACE_DEBUG(FULL, "[rt-ereg] Added %d rules successfully.", rtereg_conf.rules_nb); + int i, sum = 0; + for (i=0; icnf_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); + return -1; + } ); + + /* Now check the type */ + { + struct dict_avp_data data; + CHECK_FCT( fd_dict_getval( rtereg_conf[rtereg_conf_size-1].avps[level-1], &data) ); + 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); + return -1; + } + } + rtereg_conf[rtereg_conf_size-1].level = level; return 0; } @@ -92,8 +147,8 @@ /* Function to report the errors */ void yyerror (YYLTYPE *ploc, char * conffile, char const *s) { - TRACE_DEBUG(INFO, "Error in configuration parsing"); - + TRACE_DEBUG(INFO, "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); else if (ploc->first_column != ploc->last_column) @@ -125,61 +180,41 @@ %% /* The grammar definition */ -conffile: rules avp rules +conffile: avp rules + | conffile avp rules ; - + /* a server entry */ -avp: AVP '=' QSTRING ';' - { - if (rtereg_conf.avp != NULL) { - yyerror(&yylloc, conffile, "Only one AVP can be specified"); - YYERROR; - } - - CHECK_FCT_DO( fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, $3, &rtereg_conf.avp, ENOENT ), - { - TRACE_DEBUG(INFO, "Unable to find '%s' AVP in the loaded dictionaries.", $3); - yyerror (&yylloc, conffile, "Invalid AVP value."); - YYERROR; - } ); - - /* Now check the type */ - { - struct dict_avp_data data; - CHECK_FCT( fd_dict_getval( rtereg_conf.avp, &data) ); - CHECK_PARAMS_DO (data.avp_basetype == AVP_TYPE_OCTETSTRING, - { - TRACE_DEBUG(INFO, "'%s' AVP in not an OCTETSTRING AVP (%d).", $3, data.avp_basetype); - yyerror (&yylloc, conffile, "AVP in not an OCTETSTRING type."); - YYERROR; - } ); - } - } +avp: AVP '=' avp_part ';' ; - + +avp_part: avp_part ':' QSTRING { if (avp_add($3) < 0) { YYERROR; } } + | QSTRING { if (avp_add($1) < 0) { YYERROR; } } + ; + rules: /* empty OK */ | rules rule ; - + rule: QSTRING ':' QSTRING '+' '=' INTEGER ';' { struct rtereg_rule * new; int err; - + /* Add new rule in the array */ - rtereg_conf.rules_nb += 1; - CHECK_MALLOC_DO(rtereg_conf.rules = realloc(rtereg_conf.rules, rtereg_conf.rules_nb * sizeof(struct rtereg_rule)), + rtereg_conf[rtereg_conf_size-1].rules_nb += 1; + CHECK_MALLOC_DO(rtereg_conf[rtereg_conf_size-1].rules = realloc(rtereg_conf[rtereg_conf_size-1].rules, rtereg_conf[rtereg_conf_size-1].rules_nb * sizeof(struct rtereg_rule)), { yyerror (&yylloc, conffile, "Not enough memory to store the configuration..."); YYERROR; } ); - - new = &rtereg_conf.rules[rtereg_conf.rules_nb - 1]; - + + new = &rtereg_conf[rtereg_conf_size-1].rules[rtereg_conf[rtereg_conf_size-1].rules_nb - 1]; + new->pattern = $1; new->server = $3; new->score = $6; - + /* Attempt to compile the regex */ CHECK_FCT_DO( err=regcomp(&new->preg, new->pattern, REG_EXTENDED | REG_NOSUB), { @@ -187,7 +222,7 @@ size_t bl; /* Error while compiling the regex */ - TRACE_DEBUG(INFO, "Error while compiling the regular expression '%s':", new->pattern); + TRACE_DEBUG(INFO, "rt_ereg: error while compiling the regular expression '%s':", new->pattern); /* Get the error message size */ bl = regerror(err, &new->preg, NULL, 0); @@ -198,10 +233,10 @@ /* Get the error message content */ regerror(err, &new->preg, buf, bl); TRACE_DEBUG(INFO, "\t%s", buf); - + /* Free the buffer, return the error */ free(buf); - + yyerror (&yylloc, conffile, "Invalid regular expression."); YYERROR; } ); diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/rt_rewrite/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/rt_rewrite/CMakeLists.txt Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,27 @@ +# The rt_rewrite extension +PROJECT("Routing extension that rewrites messages, replacing and removing AVPs" C) + +# List of source files +SET(RT_REWRITE_SRC + rt_rewrite.c + lex.rt_rewrite_conf.c + rt_rewrite_conf.tab.c + rt_rewrite_conf.tab.h +) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) + +BISON_FILE(rt_rewrite_conf.y) +FLEX_FILE(rt_rewrite_conf.l) +SET_SOURCE_FILES_PROPERTIES(lex.rt_rewrite_conf.c rt_rewrite_conf.tab.c PROPERTIES COMPILE_FLAGS "-I ${CMAKE_CURRENT_SOURCE_DIR}") + +# Compile these files as a freeDiameter extension +FD_ADD_EXTENSION(rt_rewrite ${RT_REWRITE_SRC}) + +#### +## INSTALL section ## + +# We install with the daemon component because it is a base feature. +INSTALL(TARGETS rt_rewrite + LIBRARY DESTINATION ${INSTALL_EXTENSIONS_SUFFIX} + COMPONENT freeDiameter-daemon) diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/rt_rewrite/rt_rewrite.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/rt_rewrite/rt_rewrite.c Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,461 @@ +/********************************************************************************************************* + * Software License Agreement (BSD License) * + * Author: Thomas Klausner * + * * + * Copyright (c) 2018, Thomas Klausner * + * All rights reserved. * + * * + * Written under contract by Effortel Technologies SA, http://effortel.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. * + *********************************************************************************************************/ + +#include +#include "rt_rewrite.h" + +#include +#include + +/* + * Replace AVPs: put their values into other AVPs + * Remove AVPs: drop them from a message + */ + +/* handler */ +static struct fd_rt_fwd_hdl * rt_rewrite_handle = NULL; + +static char *config_file; + +struct avp_match *avp_match_start = NULL; + +static pthread_rwlock_t rt_rewrite_lock; + +#define MODULE_NAME "rt_rewrite" + +struct store { + struct avp *avp; + struct avp_target *target; + struct store *next; +}; + +static struct store *store_new(void) { + struct store *ret; + + if ((ret=malloc(sizeof(*ret))) == NULL) { + fd_log_error("%s: malloc failure", MODULE_NAME); + return NULL; + } + ret->avp = NULL; + ret->target = NULL; + ret->next = NULL; + + return ret; +} + +static void store_free(struct store *store) +{ + while (store) { + struct store *next; + if (store->avp) { + fd_msg_free((msg_or_avp *)store->avp); + } + store->target = NULL; + next = store->next; + free(store); + store = next; + } + return; +} + +static int fd_avp_search_avp(msg_or_avp *where, struct dict_object *what, struct avp **avp) +{ + struct avp *nextavp; + struct dict_avp_data dictdata; + enum dict_object_type dicttype; + + 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(where, MSG_BRW_FIRST_CHILD, (void *)&nextavp, NULL)); + while (nextavp) { + struct avp_hdr *header = NULL; + struct dict_object *model = NULL; + if (fd_msg_avp_hdr(nextavp, &header) != 0) { + fd_log_notice("%s: unable to get header for AVP", MODULE_NAME); + return -1; + } + if (fd_msg_model(nextavp, &model) != 0) { + fd_log_notice("%s: unable to get model for AVP (%d, vendor %d)", MODULE_NAME, header->avp_code, header->avp_vendor); + return 0; + } + if (model == NULL) { + fd_log_notice("%s: unknown AVP (%d, vendor %d) (not in dictionary), skipping", MODULE_NAME, header->avp_code, header->avp_vendor); + } else { + if ((header->avp_code == dictdata.avp_code) && (header->avp_vendor == dictdata.avp_vendor)) { + break; + } + } + + /* Otherwise move to next AVP in the message */ + CHECK_FCT(fd_msg_browse(nextavp, MSG_BRW_NEXT, (void *)&nextavp, NULL) ); + } + + if (avp) + *avp = nextavp; + + if (*avp || nextavp) { + return 0; + } else { + return ENOENT; + } +} + + + +static msg_or_avp *find_container(msg_or_avp *msg, struct avp_target *target) +{ + msg_or_avp *location = msg; + while (target->child) { + struct dict_object *avp_do; + msg_or_avp *new_location = NULL; + int ret; + + fd_log_debug("%s: looking for '%s'", MODULE_NAME, target->name); + if ((ret=fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_ALL_VENDORS, target->name, &avp_do, ENOENT)) != 0) { + fd_log_error("%s: target AVP '%s' not in dictionary: %s", MODULE_NAME, target->name, strerror(ret)); + return NULL; + } + if ((ret=fd_avp_search_avp(location, avp_do, (struct avp **)&new_location)) != 0) { + fd_log_debug("%s: did not find '%s', adding it", MODULE_NAME, target->name); + struct avp *avp = NULL; + if ((ret = fd_msg_avp_new(avp_do, 0, &avp)) != 0) { + fd_log_notice("%s: unable to create new '%s' AVP", MODULE_NAME, target->name); + return NULL; + } + if ((ret=fd_msg_avp_add(location, MSG_BRW_LAST_CHILD, avp)) != 0) { + fd_log_error("%s: cannot add AVP '%s' to message: %s", MODULE_NAME, target->name, strerror(ret)); + return NULL; + } + fd_log_debug("%s: '%s' added", MODULE_NAME, target->name); + /* now find it in the new place */ + continue; + } else { + location = new_location; + fd_log_debug("%s: found '%s'", MODULE_NAME, target->name); + } + target = target->child; + } + fd_log_debug("%s: returning AVP for '%s'", MODULE_NAME, target->name); + return location; +} + +static int store_apply(msg_or_avp *msg, struct store **store) +{ + while (*store) { + msg_or_avp *container; + struct store *next; + if ((*store)->avp) { + int ret; + if ((container=find_container(msg, (*store)->target)) == NULL) { + fd_log_error("%s: internal error, container not found", MODULE_NAME); + return -1; + } + + if ((ret=fd_msg_avp_add(container, MSG_BRW_LAST_CHILD, (*store)->avp)) != 0) { + fd_log_error("%s: cannot add AVP '%s' to message: %s", MODULE_NAME, (*store)->target->name, strerror(ret)); + return -1; + } + } + next = (*store)->next; + free(*store); + *store = next; + } + return 0; +} + +static int schedule_for_adding(struct avp *avp, struct avp_target *target, struct store *store) +{ + if (store->avp) { + struct store *new; + if ((new=store_new()) == NULL) { + return -1; + } + new->avp = avp; + new->target = target; + new->next = store->next; + store->next = new; + } else { + store->avp = avp; + store->target = target; + } + fd_log_debug("%s: noted %s for later adding", MODULE_NAME, target->name); + return 0; +} + +static void move_avp_to_target(union avp_value *avp_value, struct avp_target *target, struct store *store) +{ + struct dict_object *avp_do; + struct avp *avp; + int ret; + struct avp_target *final = target; + + while (final->child) { + final = final->child; + } + if ((ret=fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_ALL_VENDORS, final->name, &avp_do, ENOENT)) != 0) { + fd_log_error("internal error, target AVP '%s' not in dictionary: %s", final->name, strerror(ret)); + return; + } + if ((ret=fd_msg_avp_new(avp_do, 0, &avp)) != 0) { + fd_log_error("internal error, error creating structure for AVP '%s': %s", final->name, strerror(ret)); + return; + } + if ((ret=fd_msg_avp_setvalue(avp, avp_value)) != 0) { + fd_log_error("internal error, cannot set value for AVP '%s': %s", final->name, strerror(ret)); + return; + } + if (schedule_for_adding(avp, target, store) != 0) { + fd_log_error("internal error, cannot add AVP '%s' to message", final->name); + return; + } + + return; +} + + +static struct avp_match *avp_to_be_replaced(const char *avp_name, struct avp_match *subtree) +{ + struct avp_match *ret; + for (ret=subtree; ret != NULL; ret=ret->next) { + if (strcmp(ret->name, avp_name) == 0) { + return ret; + } + } + return NULL; +} + +/* + * msg: whole message + * avp: current AVP in message + * subtree: comparison subtree + */ +static int replace_avps(struct msg *msg, msg_or_avp *avp, struct avp_match *subtree, struct store *store) +{ + int nothing_left = 1; + /* for each AVP in message */ + while (avp) { + struct avp_hdr *header = NULL; + struct dict_object *model = NULL; + const char *avp_name = NULL; + msg_or_avp *next; + int delete = 0; + + if (fd_msg_avp_hdr(avp, &header) != 0) { + fd_log_notice("internal error: unable to get header for AVP"); + return 0; + } + if (fd_msg_model(avp, &model) != 0) { + fd_log_notice("internal error: unable to get model for AVP (%d, vendor %d)", header->avp_code, header->avp_vendor); + return 0; + } + if (model == NULL) { + fd_log_notice("unknown AVP (%d, vendor %d) (not in dictionary), skipping", header->avp_code, header->avp_vendor); + + } else { + struct dict_avp_data dictdata; + struct avp_match *subtree_match; + enum dict_avp_basetype basetype = AVP_TYPE_OCTETSTRING; + + fd_dict_getval(model, &dictdata); + avp_name = dictdata.avp_name; + basetype = dictdata.avp_basetype; + /* check if it exists in the subtree */ + if ((subtree_match = avp_to_be_replaced(avp_name, subtree))) { + /* if this should be deleted, mark as such */ + if (subtree_match->drop) { + fd_log_notice("%s: dropping AVP '%s'", MODULE_NAME, avp_name); + delete = 1; + } + /* if grouped, dive down */ + if (basetype == AVP_TYPE_GROUPED) { + msg_or_avp *child = NULL; + + fd_log_debug("%s: grouped AVP '%s'", MODULE_NAME, avp_name); + if (fd_msg_browse(avp, MSG_BRW_FIRST_CHILD, &child, NULL) != 0) { + fd_log_notice("internal error: unable to browse message at AVP (%d, vendor %d)", header->avp_code, header->avp_vendor); + return 0; + } + + /* replace_avps returns if the AVP was emptied out */ + if (replace_avps(msg, child, subtree_match->children, store)) { + fd_log_notice("%s: removing empty grouped AVP '%s'", MODULE_NAME, avp_name); + delete = 1; + } + } + else { + /* if single, remove it and add replacement AVP in target structure */ + if (subtree_match->target) { + struct avp_target *final = subtree_match->target; + while (final->child) { + final = final->child; + } + fd_log_notice("%s: moving AVP '%s' to '%s'", MODULE_NAME, avp_name, final->name); + move_avp_to_target(header->avp_value, subtree_match->target, store); + delete = 1; + } + } + } + } + fd_msg_browse(avp, MSG_BRW_NEXT, &next, NULL); + if (delete) { + /* remove AVP from message */ + fd_msg_free((msg_or_avp *)avp); + } else { + nothing_left = 0; + } + + avp = next; + } + + return nothing_left; +} + +static volatile int in_signal_handler = 0; + +/* signal handler */ +static void sig_hdlr(void) +{ + struct avp_match *old_config; + + if (in_signal_handler) { + fd_log_error("%s: already handling a signal, ignoring new one", MODULE_NAME); + return; + } + in_signal_handler = 1; + + if (pthread_rwlock_wrlock(&rt_rewrite_lock) != 0) { + fd_log_error("%s: locking failed, aborting config reload", MODULE_NAME); + return; + } + + /* save old config in case reload goes wrong */ + old_config = avp_match_start; + avp_match_start = NULL; + + if (rt_rewrite_conf_handle(config_file) != 0) { + fd_log_notice("%s: error reloading configuration, restoring previous configuration", MODULE_NAME); + avp_match_free(avp_match_start); + avp_match_start = old_config; + } else { + avp_match_free(old_config); + } + + if (pthread_rwlock_unlock(&rt_rewrite_lock) != 0) { + fd_log_error("%s: unlocking failed after config reload, exiting", MODULE_NAME); + exit(1); + } + + fd_log_notice("%s: reloaded configuration", MODULE_NAME); + + in_signal_handler = 0; +} + +static int rt_rewrite(void * cbdata, struct msg **msg) +{ + int ret; + msg_or_avp *avp = NULL; + struct store *store = NULL; + + /* nothing configured */ + if (avp_match_start == NULL) { + return 0; + } + + if ((store=store_new()) == NULL) { + fd_log_error("%s: malloc failure"); + return ENOMEM; + } + 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); + 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); + return ret; + } + if (replace_avps(*msg, avp, avp_match_start->children, store) != 0) { + fd_log_error("%s: replace AVP function failed", MODULE_NAME); + store_free(store); + return -1; + } + return store_apply(*msg, &store); +} + +/* entry point */ +static int rt_rewrite_entry(char * conffile) +{ + int ret; + config_file = conffile; + + pthread_rwlock_init(&rt_rewrite_lock, NULL); + + if (pthread_rwlock_wrlock(&rt_rewrite_lock) != 0) { + fd_log_notice("%s: write-lock failed, aborting", MODULE_NAME); + return EDEADLK; + } + + /* Parse the configuration file */ + if ((ret=rt_rewrite_conf_handle(config_file)) != 0) { + pthread_rwlock_unlock(&rt_rewrite_lock); + return ret; + } + + if (pthread_rwlock_unlock(&rt_rewrite_lock) != 0) { + fd_log_notice("%s: write-unlock failed, aborting", MODULE_NAME); + return EDEADLK; + } + + /* Register reload callback */ + CHECK_FCT(fd_event_trig_regcb(SIGUSR1, MODULE_NAME, sig_hdlr)); + + /* Register the callback */ + if ((ret=fd_rt_fwd_register(rt_rewrite, NULL, RT_FWD_ALL, &rt_rewrite_handle)) != 0) { + fd_log_error("Cannot register callback handler"); + return ret; + } + + fd_log_notice("Extension 'Rewrite' initialized"); + return 0; +} + +/* Unload */ +void fd_ext_fini(void) +{ + /* Unregister the callbacks */ + fd_rt_fwd_unregister(rt_rewrite_handle, NULL); + return ; +} + +EXTENSION_ENTRY("rt_rewrite", rt_rewrite_entry); diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/rt_rewrite/rt_rewrite.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/rt_rewrite/rt_rewrite.h Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,57 @@ +/********************************************************************************************************* + * Software License Agreement (BSD License) * + * Author: Thomas Klausner * + * * + * Copyright (c) 2018, Thomas Klausner * + * All rights reserved. * + * * + * Written under contract by Effortel Technologies SA, http://effortel.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. * + *********************************************************************************************************/ + +/* FreeDiameter's common include file */ +#include + +/* Parse the configuration file */ +int rt_rewrite_conf_handle(char * conffile); + +extern struct avp_match *avp_match_start; +struct avp_match { + char *name; + + struct avp_match *next; + + /* either avp_children_list OR avp_target can be used */ + /* NULL avp_children_list AND NULL avp_target -> drop AVP */ + struct avp_match *children; + struct avp_target *target; + int drop; +}; + +struct avp_target { + char *name; + + struct avp_target *child; +}; + +void avp_match_free(struct avp_match *match); diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/rt_rewrite/rt_rewrite_conf.l --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/rt_rewrite/rt_rewrite_conf.l Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,100 @@ +/********************************************************************************************************* + * Software License Agreement (BSD License) * + * Author: Thomas Klausner * + * * + * Copyright (c) 2018, Thomas Klausner * + * All rights reserved. * + * * + * Written under contract by Effortel Technologies SA, http://effortel.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. * + *********************************************************************************************************/ + +/* Tokenizer + * + */ + +%{ +#include "rt_rewrite.h" +/* Include yacc tokens definitions */ +#include "rt_rewrite_conf.tab.h" + +/* Update the column information */ +#define YY_USER_ACTION { \ + yylloc->first_column = yylloc->last_column + 1; \ + yylloc->last_column = yylloc->first_column + yyleng - 1; \ +} + +/* Avoid warning with newer flex */ +#define YY_NO_INPUT + +%} + +qstring \"[^\"\n]*\" + + +%option bison-bridge bison-locations +%option noyywrap +%option nounput + +%% + + /* Update the line count */ +\n { + yylloc->first_line++; + yylloc->last_line++; + yylloc->last_column=0; + } + + /* Eat all spaces but not new lines */ +([[:space:]]{-}[\n])+ ; + /* Eat all comments */ +#.*$ ; + + + /* Recognize quoted strings */ +{qstring} { + /* 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)); + return LEX_ERROR; /* trig an error in yacc parser */ + } ); + yylval->string[strlen(yytext) - 2] = '\0'; + return QSTRING; + } + + + /* The key words */ +(?i:MAP) { return MAP; } +(?i:DROP) { return DROP; } + + /* Valid single characters for yyparse */ +[=:;>] { return yytext[0]; } + + /* Unrecognized sequence, if it did not match any previous pattern */ +[^[:space:]\":=>;\n]+ { + fd_log_debug("Unrecognized text on line %d col %d: '%s'.", yylloc->first_line, yylloc->first_column, yytext); + return LEX_ERROR; + } + +%% diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/rt_rewrite/rt_rewrite_conf.y --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/rt_rewrite/rt_rewrite_conf.y Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,421 @@ +/********************************************************************************************************* + * Software License Agreement (BSD License) * + * Author: Thomas Klausner * + * * + * Copyright (c) 2018, Thomas Klausner * + * All rights reserved. * + * * + * Written under contract by Effortel Technologies SA, http://effortel.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. * + *********************************************************************************************************/ + +/* Yacc extension's configuration parser. + */ + +/* For development only : */ +%debug +%error-verbose + +/* The parser receives the configuration file filename as parameter */ +%parse-param {char * conffile} + +/* Keep track of location */ +%locations +%pure-parser + +%{ +#include "rt_rewrite.h" +#include "rt_rewrite_conf.tab.h" /* bison is not smart enough to define the YYLTYPE before including this code, so... */ + +/* Forward declaration */ +int yyparse(char * conffile); +void rt_rewrite_confrestart(FILE *input_file); + +/* copied from libfdproto/dictionary.c because the symbol is not public */ +static const char * type_base_name[] = { /* must keep in sync with dict_avp_basetype */ + "Grouped", /* AVP_TYPE_GROUPED */ + "Octetstring", /* AVP_TYPE_OCTETSTRING */ + "Integer32", /* AVP_TYPE_INTEGER32 */ + "Integer64", /* AVP_TYPE_INTEGER64 */ + "Unsigned32", /* AVP_TYPE_UNSIGNED32 */ + "Unsigned64", /* AVP_TYPE_UNSIGNED64 */ + "Float32", /* AVP_TYPE_FLOAT32 */ + "Float64" /* AVP_TYPE_FLOAT64 */ + }; + +static struct avp_match *avp_match_new(char *name); + +static struct avp_match *source_target = NULL, *drop_target = NULL; +static struct avp_target *dest_target = NULL; + +static void print_target(struct avp_target *target, char *prefix) +{ + char *output = NULL; + if (asprintf(&output, "%s -> /TOP/%s", prefix, target->name) == -1) { + fd_log_error("rt_rewrite: print_target: setup: asprintf failed: %s", strerror(errno)); + return; + } + for (target=target->child; target != NULL; target=target->child) { + char *new_output = NULL; + if (asprintf(&new_output, "%s/%s", output, target->name) == -1) { + fd_log_error("rt_rewrite: print_target: asprintf failed: %s", strerror(errno)); + free(output); + return; + } + free(output); + output = new_output; + new_output = NULL; + } + fd_log_debug(output); + free(output); + return; +} + +static void compare_avp_type(const char *source, const char *dest) +{ + struct dict_object *model_source, *model_dest; + struct dict_avp_data dictdata_source, dictdata_dest; + + if (fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_ALL_VENDORS, source, &model_source, ENOENT) != 0) { + fd_log_error("Unable to find '%s' AVP in the loaded dictionaries", source); + return; + } + if (fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_ALL_VENDORS, dest, &model_dest, ENOENT) != 0) { + fd_log_error("Unable to find '%s' AVP in the loaded dictionaries", dest); + return; + } + 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]); + } + return; +} + +static void compare_avp_types(struct avp_match *start) +{ + struct avp_match *iter; + for (iter=start; iter != NULL; iter=iter->next) { + compare_avp_types(iter->children); + if (iter->target) { + struct avp_target *final; + final = iter->target; + while (final->child) { + final = final->child; + } + compare_avp_type(iter->name, final->name); + } + } + return; +} + +static void dump_config(struct avp_match *start, char *prefix) +{ + char *new_prefix = NULL; + struct avp_match *iter; + for (iter=start; iter != NULL; iter=iter->next) { + if (asprintf(&new_prefix, "%s/%s", prefix, iter->name) == -1) { + fd_log_error("rt_rewrite: dump_config: asprintf failed: %s", strerror(errno)); + return; + } + dump_config(iter->children, new_prefix); + if (iter->target) { + print_target(iter->target, new_prefix); + } + if (iter->drop) { + fd_log_debug("%s -> DROP", new_prefix); + } + free(new_prefix); + new_prefix = NULL; + } + return; +} + +/* Parse the configuration file */ +int rt_rewrite_conf_handle(char * conffile) +{ + extern FILE * rt_rewrite_confin; + int ret; + char *top; + + TRACE_ENTRY("%p", conffile); + + TRACE_DEBUG (FULL, "Parsing configuration file: '%s'", conffile); + + /* to match other entries */ + if ((top=strdup("TOP")) == NULL) { + fd_log_error("strdup error: %s", strerror(errno)); + return EINVAL; + } + if ((avp_match_start=avp_match_new(top)) == NULL) { + fd_log_error("malloc error: %s", strerror(errno)); + free(top); + return EINVAL; + } + rt_rewrite_confin = fopen(conffile, "r"); + if (rt_rewrite_confin == NULL) { + ret = errno; + fd_log_debug("Unable to open extension configuration file '%s' for reading: %s", conffile, strerror(ret)); + TRACE_DEBUG (INFO, "rt_rewrite: error occurred, message logged -- configuration file."); + avp_match_free(avp_match_start); + avp_match_start = NULL; + return ret; + } + + rt_rewrite_confrestart(rt_rewrite_confin); + ret = yyparse(conffile); + + fclose(rt_rewrite_confin); + + if (ret != 0) { + TRACE_DEBUG(INFO, "rt_rewrite: unable to parse the configuration file."); + avp_match_free(avp_match_start); + avp_match_start = NULL; + return EINVAL; + } + + compare_avp_types(avp_match_start); + dump_config(avp_match_start, ""); + + return 0; +} + +static int verify_avp(const char *name) +{ + struct dict_object *model; + struct dict_avp_data dictdata; + + if (fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_ALL_VENDORS, name, &model, ENOENT) != 0) { + fd_log_error("Unable to find '%s' AVP in the loaded dictionaries", name); + return -1; + } + fd_dict_getval(model, &dictdata); + if (dictdata.avp_basetype == AVP_TYPE_GROUPED) { + return 1; + } + return 0; +} + +static struct avp_match *avp_match_new(char *name) { + struct avp_match *ret; + + if ((ret=malloc(sizeof(*ret))) == NULL) { + fd_log_error("malloc error"); + return NULL; + } + ret->name = name; + ret->next = NULL; + ret->children = NULL; + ret->target = NULL; + ret->drop = 0; + return ret; +} + +static void avp_target_free(struct avp_target *target) { + struct avp_target *iter; + + for (iter=target; iter != NULL; ) { + struct avp_target *next; + free(iter->name); + next = iter->child; + free(iter); + iter = next; + } +} + +void avp_match_free(struct avp_match *match) { + struct avp_match *iter; + + for (iter=match; iter != NULL; ) { + struct avp_match *next; + free(iter->name); + next = iter->next; + avp_match_free(iter->children); + avp_target_free(iter->target); + free(iter); + iter = next; + } +} + +static struct avp_target *target_new(char *name) { + struct avp_target *ret; + + if ((ret=malloc(sizeof(*ret))) == NULL) { + fd_log_error("malloc error"); + return NULL; + } + ret->name = name; + ret->child = NULL; + return ret; +} + +static struct avp_match *add_avp_next_to(char *name, struct avp_match *target) +{ + struct avp_match *iter, *prev; + + if (target == NULL) { + return avp_match_new(name); + } + + for (prev=iter=target; iter != NULL; iter=iter->next) { + if (strcmp(iter->name, name) == 0) { + return iter; + } + prev = iter; + } + prev->next = avp_match_new(name); + return prev->next; +} + +static int add(struct avp_match **target, char *name) +{ + struct avp_match *temp; + if (verify_avp(name) < 0) { + return -1; + } + temp = add_avp_next_to(name, (*target)->children); + if ((*target)->children == NULL) { + (*target)->children = temp; + } + *target = temp; + return 0; +} + +/* build tree for source */ +static int source_add(char *name) +{ + if (source_target == NULL) { + source_target = avp_match_start; + } + return add(&source_target, name); +} + +/* build tree for destination */ +static int dest_add(char *name) +{ + struct avp_target *temp; + + if (verify_avp(name) < 0) { + return -1; + } + if ((temp=target_new(name)) == NULL) { + dest_target = NULL; + source_target = NULL; + return -1; + } + if (dest_target == NULL) { + dest_target = temp; + source_target->target = dest_target; + source_target = NULL; + return 0; + } + dest_target->child = temp; + dest_target = temp; + return 0; +} + +static void dest_finish(void) +{ + dest_target = NULL; +} + +/* same as source_add, but for drop */ +static int drop_add(char *name) +{ + if (drop_target == NULL) { + drop_target = avp_match_start; + } + return add(&drop_target, name); +} + +/* mark as to-drop */ +static void drop_finish(void) +{ + drop_target->drop = 1; + drop_target = NULL; +} + +/* The Lex parser prototype */ +int rt_rewrite_conflex(YYSTYPE *lvalp, YYLTYPE *llocp); + +/* Function to report the errors */ +void yyerror (YYLTYPE *ploc, char * conffile, char const *s) +{ + TRACE_DEBUG(INFO, "rt_rewrite: 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); + else if (ploc->first_column != ploc->last_column) + fd_log_debug("%s:%d.%d-%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_column, s); + else + fd_log_debug("%s:%d.%d : %s", conffile, ploc->first_line, ploc->first_column, s); +} + +%} + +/* Values returned by lex for token */ +%union { + char *string; /* The string is allocated by strdup in lex.*/ +} + +/* In case of error in the lexical analysis */ +%token LEX_ERROR + +/* A (de)quoted string (malloc'd in lex parser; it must be freed after use) */ +%token QSTRING + +/* Tokens */ +%token MAP +%token DROP + + +/* -------------------------------------- */ +%% + + /* The grammar definition */ +rules: /* empty ok */ + | rules map + | rules drop + ; + +/* source -> destination mapping */ +map: MAP '=' source_part '>' dest_part { dest_finish(); } + ';' + ; + +source_part: source_part ':' QSTRING { if (source_add($3) < 0) { YYERROR; } } + | QSTRING { if (source_add($1) < 0) { YYERROR; } } + ; + +dest_part: dest_part ':' QSTRING { if (dest_add($3) < 0) { YYERROR; } } + | QSTRING { if (dest_add($1) < 0) { YYERROR; } } + ; + +/* for dropping an AVP */ +drop: DROP '=' drop_part { drop_finish(); } + ';' + ; + +drop_part: drop_part ':' QSTRING { if (drop_add($3) < 0) { YYERROR; } } + | QSTRING { if (drop_add($1) < 0) { YYERROR; } } + ; diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/test_as/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/test_as/CMakeLists.txt Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,13 @@ +# The test_as extension +PROJECT("Abort Session dummy server" C) + +FD_ADD_EXTENSION(test_as test_as.c) + + +#### +## INSTALL section ## + +INSTALL(TARGETS test_as + LIBRARY DESTINATION ${INSTALL_EXTENSIONS_SUFFIX} + COMPONENT freeDiameter-debug-tools) + diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/test_as/test_as.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/test_as/test_as.c Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,101 @@ +/********************************************************************************************************** + * Software License Agreement(BSD License) * + * Author: Thomas Klausner * + * * + * Copyright(c) 2019, Thomas Klausner * + * All rights reserved. * + * * + * Written under contract by Effortel Technologies SA, http://effortel.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 simply receives ASR and sends ASA after displaying the content, but does not store any data */ + +#include + +struct disp_hdl *asr_handler_hdl; + +static int asr_handler(struct msg ** msg, struct avp * avp, struct session * sess, void * data, enum disp_action * act) +{ + struct msg_hdr *hdr = NULL; + + TRACE_ENTRY("%p %p %p %p", msg, avp, sess, act); + + if(msg == NULL) + return EINVAL; + + CHECK_FCT(fd_msg_hdr(*msg, &hdr)); + if(hdr->msg_flags & CMD_FLAG_REQUEST) { + /* Request received, answer it */ + struct msg *answer; + os0_t s; + size_t sl; + + /* 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 into the answer */ + /* TODO make result code configurable, depending on an AVP value? */ + CHECK_FCT(fd_msg_rescode_set(answer, "DIAMETER_SUCCESS", NULL, NULL, 1)); + + fd_log_notice("--------------Received the following Abort Session Request:--------------"); + + CHECK_FCT(fd_sess_getsid(sess, &s, &sl)); + fd_log_notice("Session: %.*s",(int)sl, s); + + fd_log_notice("----------------------------------------------------------------------"); + + /* Send the answer */ + CHECK_FCT(fd_msg_send(msg, NULL, NULL)); + + } else { + /* We received an answer message, just discard it */ + CHECK_FCT(fd_msg_free(*msg)); + *msg = NULL; + } + + return 0; +} + +/* entry hook: register callback */ +static int as_entry(char * conffile) +{ + struct disp_when data; + + TRACE_ENTRY("%p", conffile); + + memset(&data, 0, sizeof(data)); + + /* Advertise the support for the Diameter Abort Session 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 ) ); + + /* register handler for ASR */ + CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Abort-Session-Request", &data.command, ENOENT) ); + CHECK_FCT( fd_disp_register( asr_handler, DISP_HOW_CC, &data, NULL, &asr_handler_hdl ) ); + + return 0; +} + +EXTENSION_ENTRY("test_as", as_entry); diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/test_cc/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/test_cc/CMakeLists.txt Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,13 @@ +# The test_cc extension +PROJECT("Credit Control dummy server" C) + +FD_ADD_EXTENSION(test_cc test_cc.c) + + +#### +## INSTALL section ## + +INSTALL(TARGETS test_cc + LIBRARY DESTINATION ${INSTALL_EXTENSIONS_SUFFIX} + COMPONENT freeDiameter-debug-tools) + diff -r 229ecec59ff5 -r 73b9f2aefb75 extensions/test_cc/test_cc.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/test_cc/test_cc.c Sun May 12 23:15:40 2019 +0800 @@ -0,0 +1,100 @@ +/********************************************************************************************************** + * Software License Agreement(BSD License) * + * Author: Thomas Klausner * + * * + * Copyright(c) 2019, Thomas Klausner * + * All rights reserved. * + * * + * Written under contract by Effortel Technologies SA, http://effortel.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 simply receives CCR and sends CCA after displaying the content, but does not store any data */ + +#include + +struct disp_hdl *ccr_handler_hdl; + +static int ccr_handler(struct msg ** msg, struct avp * avp, struct session * sess, void * data, enum disp_action * act) +{ + struct msg_hdr *hdr = NULL; + + TRACE_ENTRY("%p %p %p %p", msg, avp, sess, act); + + if(msg == NULL) + return EINVAL; + + CHECK_FCT(fd_msg_hdr(*msg, &hdr)); + if(hdr->msg_flags & CMD_FLAG_REQUEST) { + /* Request received, answer it */ + struct msg *answer; + os0_t s; + size_t sl; + + /* 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 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:--------------"); + + CHECK_FCT(fd_sess_getsid(sess, &s, &sl)); + fd_log_notice("Session: %.*s",(int)sl, s); + + fd_log_notice("----------------------------------------------------------------------"); + + /* Send the answer */ + CHECK_FCT(fd_msg_send(msg, NULL, NULL)); + + } else { + /* We received an answer message, just discard it */ + CHECK_FCT(fd_msg_free(*msg)); + *msg = NULL; + } + + return 0; +} + +/* entry hook: register callback */ +static int cc_entry(char * conffile) +{ + struct disp_when data; + + TRACE_ENTRY("%p", conffile); + + 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 ) ); + + /* register handler for CCR */ + CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Credit-Control-Request", &data.command, ENOENT) ); + CHECK_FCT( fd_disp_register( ccr_handler, DISP_HOW_CC, &data, NULL, &ccr_handler_hdl ) ); + + return 0; +} + +EXTENSION_ENTRY("test_cc", cc_entry); diff -r 229ecec59ff5 -r 73b9f2aefb75 freeDiameterd/main.c --- a/freeDiameterd/main.c Sun Jan 21 22:25:07 2018 +0800 +++ b/freeDiameterd/main.c Sun May 12 23:15:40 2019 +0800 @@ -33,13 +33,18 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * *********************************************************************************************************/ +#if defined(__GLIBC__) +#define _BSD_SOURCE /* for vsyslog */ +#endif + #include #include #include #include #include - +#include +#include /* forward declarations */ static int main_cmdline(int argc, char *argv[]); @@ -55,56 +60,86 @@ } +static void syslog_logger(int loglevel, const char * format, va_list args) +{ + int level; + + switch (loglevel) { + case FD_LOG_NOTICE: + level = LOG_NOTICE; + break; + case FD_LOG_ERROR: + level = LOG_ERR; + break; + case FD_LOG_FATAL: + level = LOG_CRIT; + break; + default: + /* fallthrough */ + 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); +} + + /* freeDiameter starting point */ int main(int argc, char * argv[]) { int ret; sigset_t sig_all; - + /* Block all signals from the current thread and all its future children -- we will catch everything in catch_signals */ sigfillset(&sig_all); ret = pthread_sigmask(SIG_BLOCK, &sig_all, NULL); ASSERT(ret == 0); - + /* Parse the command-line */ ret = main_cmdline(argc, argv); if (ret != 0) { return ret; } - + /* Initialize the core library */ ret = fd_core_initialize(); if (ret != 0) { fprintf(stderr, "An error occurred during freeDiameter core library initialization.\n"); return ret; } - + /* Set gnutls debug level ? */ if (gnutls_debug) { gnutls_global_set_log_function((gnutls_log_func)fd_gnutls_debug); gnutls_global_set_log_level (gnutls_debug); TRACE_DEBUG(INFO, "Enabled GNUTLS debug at level %d", gnutls_debug); } - + /* Parse the configuration file */ CHECK_FCT_DO( fd_core_parseconf(conffile), goto error ); - + /* Start the servers */ CHECK_FCT_DO( fd_core_start(), goto error ); - + /* Allow SIGINT and SIGTERM from this point to terminate the application */ CHECK_POSIX_DO( pthread_create(&signals_thr, NULL, catch_signals, NULL), goto error ); - + TRACE_DEBUG(INFO, FD_PROJECT_BINARY " daemon initialized."); /* Now, just wait for termination */ CHECK_FCT( fd_core_wait_shutdown_complete() ); - + /* Just in case it was not the result of a signal, we cancel signals_thr */ fd_thr_term(&signals_thr); - + return 0; -error: +error: CHECK_FCT_DO( fd_core_shutdown(), ); CHECK_FCT( fd_core_wait_shutdown_complete() ); fd_thr_term(&signals_thr); @@ -137,7 +172,8 @@ 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"); + " default location (" DEFAULT_CONF_PATH "/" FD_DEFAULT_CONF_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" @@ -155,11 +191,12 @@ int c; int option_index = 0; char * locale; - + struct option long_options[] = { { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'V' }, { "config", required_argument, NULL, 'c' }, + { "syslog", no_argument, NULL, 's' }, { "debug", no_argument, NULL, 'd' }, { "quiet", no_argument, NULL, 'q' }, { "dbglocale", optional_argument, NULL, 'l' }, @@ -168,13 +205,13 @@ { "dbg_gnutls", required_argument, NULL, 'g' }, { NULL, 0, NULL, 0 } }; - + /* Loop on arguments */ while (1) { - c = getopt_long (argc, argv, "hVc:dql:f:F:g:", long_options, &option_index); - if (c == -1) + c = getopt_long (argc, argv, "hVc: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(); @@ -199,11 +236,11 @@ return EINVAL; } break; - + case 'd': /* Increase verbosity of debug messages. */ fd_g_debug_lvl--; break; - + case 'f': /* Full debug for the function with this name. */ #ifdef DEBUG fd_debug_one_function = optarg; @@ -213,7 +250,7 @@ return EINVAL; #endif /* DEBUG */ break; - + case 'F': /* Full debug for the file with this name. */ #ifdef DEBUG fd_debug_one_file = basename(optarg); @@ -223,15 +260,22 @@ return EINVAL; #endif /* DEBUG */ break; - + case 'g': /* Set a debug level and function for GNU TLS calls. */ gnutls_debug = (int)atoi(optarg); break; - + case 'q': /* Decrease verbosity then remove debug messages. */ fd_g_debug_lvl++; break; + case 's': /* Write log data using syslog(3) */ + if (fd_log_handler_register(syslog_logger) != 0) { + fprintf(stderr, "Cannot initialize syslog logger\n"); + return EINVAL; + } + break; + case '?': /* Invalid option. */ /* `getopt_long' already printed an error message. */ fprintf(stderr, "getopt_long found an invalid character\n"); @@ -243,7 +287,7 @@ return EINVAL; } } - + return 0; } @@ -252,29 +296,29 @@ { sigset_t ss; fd_log_threadname ( "signals catcher" ); - + sigemptyset(&ss); - + /* Signals that terminate the daemon */ sigaddset(&ss, SIGTERM); sigaddset(&ss, SIGINT); - + /* Signals that send an event */ sigaddset(&ss, SIGUSR1); sigaddset(&ss, SIGUSR2); - + /* We unblock all other signals, so that their default handler is used (such as SIGTSTP) */ CHECK_SYS_DO( pthread_sigmask( SIG_SETMASK, &ss, NULL ), goto out ); - + /* Now loop on the reception of the signal */ while (1) { int sig, *ps; - + /* Wait to receive the next signal */ CHECK_POSIX_DO( sigwait(&ss, &sig), break ); - + TRACE_DEBUG(FULL, "Signal %d caught", sig); - + switch (sig) { case SIGUSR1: case SIGUSR2: @@ -282,14 +326,14 @@ *ps = sig; CHECK_FCT_DO( fd_event_send(fd_g_config->cnf_main_ev, FDEV_TRIGGER, sizeof(int), ps), goto out ); break; - + case SIGINT: case SIGTERM: CHECK_FCT_DO( fd_core_shutdown(), goto out ); } } -out: +out: /* Better way to handle this ? */ ASSERT(0); return NULL; diff -r 229ecec59ff5 -r 73b9f2aefb75 include/freeDiameter/CMakeLists.txt --- a/include/freeDiameter/CMakeLists.txt Sun Jan 21 22:25:07 2018 +0800 +++ b/include/freeDiameter/CMakeLists.txt Sun May 12 23:15:40 2019 +0800 @@ -17,7 +17,7 @@ # 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) - + # Create the absolute path for searching extensions SET(DEFAULT_EXTENSIONS_PATH ${CMAKE_INSTALL_PREFIX}/${INSTALL_EXTENSIONS_SUFFIX}) @@ -31,8 +31,8 @@ # Note: if someone needs, we could also make the delay configurable here... OPTION(DISABLE_PEER_EXPIRY "Disable RFC3539 Peers Connections Expiration after inactivity?" OFF) -# The following workaround increases compatibility with some implementations without breaking anything in freeDiameter, -# so it can be enabled without risk. We keep it disabled by default anyway for those people who use freeDiameter to check the +# The following workaround increases compatibility with some implementations without breaking anything in freeDiameter, +# so it can be enabled without risk. We keep it disabled by default anyway for those people who use freeDiameter to check the # compliancy of their implementation with the Diameter RFC... OPTION(WORKAROUND_ACCEPT_INVALID_VSAI "Do not reject a CER/CEA with a Vendor-Specific-Application-Id AVP containing both Auth- and Acct- application AVPs?" OFF) @@ -44,7 +44,7 @@ INCLUDE (CheckLibraryExists) INCLUDE (CheckFunctionExists) INCLUDE (CheckIncludeFiles) -INCLUDE (CheckSymbolExists) +INCLUDE (CheckSymbolExists) INCLUDE (CheckCSourceCompiles) INCLUDE (TestBigEndian) @@ -133,7 +133,7 @@ SET(SCTP_LIBRARIES ${SCTP_LIBRARIES} PARENT_SCOPE) # IDNA process: we use libidn from GNU (unless the function & header files are included in libc) -IF(NOT DIAMID_IDNA_IGNORE AND NOT DIAMID_IDNA_REJECT) +IF(NOT DIAMID_IDNA_IGNORE AND NOT DIAMID_IDNA_REJECT) FIND_PACKAGE(IDNA) SET(CHECK_IDNA_SOURCE_CODE " #include @@ -159,20 +159,20 @@ SET(GNUTLS_INCLUDE_DIR ${GNUTLS_INCLUDE_DIR} PARENT_SCOPE) SET(GNUTLS_LIBRARIES ${GNUTLS_LIBRARIES} PARENT_SCOPE) -find_path(GCRYPT_INCLUDE_DIR NAMES gcrypt.h) -If ( NOT GCRYPT_INCLUDE_DIR ) +FIND_PATH(GCRYPT_INCLUDE_DIR NAMES gcrypt.h) +IF(NOT GCRYPT_INCLUDE_DIR) MESSAGE(SEND_ERROR "Unable to find gcrypt.h, please install libgcrypt-dev or equivalent") -Endif ( NOT GCRYPT_INCLUDE_DIR ) +ENDIF(NOT GCRYPT_INCLUDE_DIR) MARK_AS_ADVANCED(GCRYPT_INCLUDE_DIR) SET(GCRYPT_INCLUDE_DIR ${GCRYPT_INCLUDE_DIR} PARENT_SCOPE) # Also we need libgcrypt to... display its version :( -find_library(GCRYPT_LIBRARY +FIND_LIBRARY(GCRYPT_LIBRARY NAMES gcrypt ) -If ( NOT GCRYPT_LIBRARY ) +IF(NOT GCRYPT_LIBRARY) MESSAGE(SEND_ERROR "Unable to find libgcrypt, please install libgcrypt or equivalent") -Endif ( NOT GCRYPT_LIBRARY ) +ENDIF(NOT GCRYPT_LIBRARY) SET(GCRYPT_LIBRARY ${GCRYPT_LIBRARY} PARENT_SCOPE) @@ -228,7 +228,7 @@ # And includes paths SET(LFDCORE_INCLUDES ${SCTP_INCLUDE_DIR} ${GNUTLS_INCLUDE_DIR} ${GCRYPT_INCLUDE_DIR} PARENT_SCOPE) # And dependencies -SET(LFDCORE_LINK_INTERFACES "" PARENT_SCOPE) +SET(LFDCORE_LINK_INTERFACES "" PARENT_SCOPE) # We don't force other libraries, the programs will link with what it needs # (such as libgnutls if it uses GNUTLS_DEBUG() macro # or libfdproto if it uses some of its interfaces directly) diff -r 229ecec59ff5 -r 73b9f2aefb75 include/freeDiameter/libfdproto.h --- a/include/freeDiameter/libfdproto.h Sun Jan 21 22:25:07 2018 +0800 +++ b/include/freeDiameter/libfdproto.h Sun May 12 23:15:40 2019 +0800 @@ -800,7 +800,7 @@ #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 - -- it does not support locales where a lowercase letter uses more space than upper case, such as ß -> ss + -- 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 !!! diff -r 229ecec59ff5 -r 73b9f2aefb75 libfdcore/sctp.c --- a/libfdcore/sctp.c Sun Jan 21 22:25:07 2018 +0800 +++ b/libfdcore/sctp.c Sun May 12 23:15:40 2019 +0800 @@ -400,7 +400,7 @@ fd_log_debug( " sctp_peer_error_event : %hhu", event.sctp_peer_error_event); fd_log_debug( " sctp_shutdown_event : %hhu", event.sctp_shutdown_event); fd_log_debug( " sctp_partial_delivery_event : %hhu", event.sctp_partial_delivery_event); - fd_log_debug( " sctp_adaptation_layer_event : %hhu", event.sctp_adaptation_layer_event); + // fd_log_debug( " sctp_adaptation_layer_event : %hhu", event.sctp_adaptation_layer_event); // fd_log_debug( " sctp_authentication_event : %hhu", event.sctp_authentication_event); } } diff -r 229ecec59ff5 -r 73b9f2aefb75 libfdcore/sctp3436.c --- a/libfdcore/sctp3436.c Sun Jan 21 22:25:07 2018 +0800 +++ b/libfdcore/sctp3436.c Sun May 12 23:15:40 2019 +0800 @@ -50,9 +50,9 @@ - the pull function retrieves the data from the fifo queue corresponding to a stream #. - the push function sends the data on a certain stream. We also have a demux thread that reads the socket and store received data in the appropriate fifo - + We have one gnutls_session per stream pair, and as many threads that read the gnutls records and save incoming data to the target queue. - + This complexity is required because we cannot read a socket for a given stream only; we can only get the next message and find its stream. */ @@ -70,21 +70,21 @@ size_t bufsz; int event; uint16_t strid; - + TRACE_ENTRY("%p", arg); CHECK_PARAMS_DO(conn && (conn->cc_socket > 0), goto out); - + /* Set the thread name */ { - char buf[48]; + char buf[100]; snprintf(buf, sizeof(buf), "Demuxer (%d:%s)", conn->cc_socket, conn->cc_remid); fd_log_threadname ( buf ); } - + ASSERT( conn->cc_proto == IPPROTO_SCTP ); ASSERT( fd_cnx_target_queue(conn) ); ASSERT( conn->cc_sctp3436_data.array ); - + do { CHECK_FCT_DO( fd_sctp_recvmeta(conn, &strid, &buf, &bufsz, &event), goto fatal ); switch (event) { @@ -97,25 +97,25 @@ free(buf); } break; - + case FDEVP_CNX_EP_CHANGE: /* Send this event to the target queue */ CHECK_FCT_DO( fd_event_send( fd_cnx_target_queue(conn), event, bufsz, buf), goto fatal ); break; - + case FDEVP_CNX_ERROR: goto out; - + case FDEVP_CNX_SHUTDOWN: /* Just ignore the notification for now, we will get another error later anyway */ continue; - + default: goto fatal; } - + } while (conn->cc_loop); - + out: /* Signal termination of the connection to all decipher threads */ for (strid = 0; strid < conn->cc_sctp_para.pairs; strid++) { @@ -124,9 +124,9 @@ } } fd_cnx_markerror(conn); - 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(), ); @@ -138,24 +138,24 @@ { struct sctp3436_ctx * ctx = arg; struct cnxctx *cnx; - + TRACE_ENTRY("%p", arg); CHECK_PARAMS_DO(ctx && ctx->raw_recv && ctx->parent, goto error); cnx = ctx->parent; ASSERT( fd_cnx_target_queue(cnx) ); - + /* Set the thread name */ { - char buf[48]; + char buf[100]; snprintf(buf, sizeof(buf), "Decipher (%hu@%d:%s)", ctx->strid, cnx->cc_socket, cnx->cc_remid); fd_log_threadname ( buf ); } - + /* The next function loops while there is no error */ CHECK_FCT_DO(fd_tls_rcvthr_core(cnx, ctx->strid ? ctx->session : cnx->cc_tls_para.session), /* continue */); error: fd_cnx_markerror(cnx); - TRACE_DEBUG(FULL, "Thread terminated"); + TRACE_DEBUG(FULL, "Thread terminated"); return NULL; } @@ -170,12 +170,12 @@ struct sctp3436_ctx * ctx = (struct sctp3436_ctx *) tr; struct timespec tsstore, *ts = NULL; int ret; - + TRACE_ENTRY("%p %d", tr, ms); - + if (ctx->partial.buf) return 1; /* data is already available for pull */ - + if (ms) { CHECK_SYS_DO( clock_gettime(CLOCK_REALTIME, &tsstore), return -1 ); tsstore.tv_nsec += (long)ms * 1000000; @@ -183,13 +183,13 @@ tsstore.tv_nsec %= 1000000000L; ts = &tsstore; } - + ret = fd_fifo_select ( ctx->raw_recv, ts ); if (ret < 0) { errno = -ret; ret = -1; } - + return ret; } #endif /* GNUTLS_VERSION_300 */ @@ -200,23 +200,23 @@ { struct sctp3436_ctx * ctx = (struct sctp3436_ctx *) tr; struct iovec iov; - + TRACE_ENTRY("%p %p %zd", tr, data, len); CHECK_PARAMS_DO( tr && data, { errno = EINVAL; return -1; } ); - + iov.iov_base = (void *)data; iov.iov_len = len; - + return fd_sctp_sendstrv(ctx->parent, ctx->strid, &iov, 1); } #else /* GNUTLS_VERSION_212 */ static ssize_t sctp3436_pushv(gnutls_transport_ptr_t tr, const giovec_t * iov, int iovcnt) { struct sctp3436_ctx * ctx = (struct sctp3436_ctx *) tr; - + TRACE_ENTRY("%p %p %d", tr, iov, iovcnt); CHECK_PARAMS_DO( tr && iov, { errno = EINVAL; return -1; } ); - + return fd_sctp_sendstrv(ctx->parent, ctx->strid, (const struct iovec *)iov, iovcnt); } #endif /* GNUTLS_VERSION_212 */ @@ -227,10 +227,10 @@ struct sctp3436_ctx * ctx = (struct sctp3436_ctx *) tr; size_t pulled = 0; int emptied; - + TRACE_ENTRY("%p %p %zd", tr, buf, len); CHECK_PARAMS_DO( tr && buf, { errno = EINVAL; goto error; } ); - + /* If we don't have data available now, pull new message from the fifo -- this is blocking (until the queue is destroyed) */ if (!ctx->partial.buf) { int ev; @@ -240,7 +240,7 @@ return -1; } } - + pulled = ctx->partial.bufsz - ctx->partial.offset; if (pulled <= len) { emptied = 1; @@ -263,7 +263,7 @@ /* We are done */ return pulled; - + error: gnutls_transport_set_errno (ctx->session, errno); return -1; @@ -277,7 +277,7 @@ { /* Set the transport pointer passed to push & pull callbacks */ GNUTLS_TRACE( gnutls_transport_set_ptr( session, (gnutls_transport_ptr_t) ctx ) ); - + /* Reset the low water value, since we don't use sockets */ #ifndef GNUTLS_VERSION_300 /* starting version 2.12, this call is not needed */ @@ -286,7 +286,7 @@ /* but in 3.0 we have to provide the pull_timeout callback */ GNUTLS_TRACE( gnutls_transport_set_pull_timeout_function( session, sctp3436_pull_timeout ) ); #endif /* GNUTLS_VERSION_300 */ - + /* Set the push and pull callbacks */ GNUTLS_TRACE( gnutls_transport_set_pull_function(session, sctp3436_pull) ); #ifndef GNUTLS_VERSION_212 @@ -324,14 +324,14 @@ { TRACE_ENTRY("%p", conn); CHECK_PARAMS( conn && !conn->cc_sctp3436_data.sess_store ); - + CHECK_MALLOC( conn->cc_sctp3436_data.sess_store = malloc(sizeof(struct sr_store)) ); memset(conn->cc_sctp3436_data.sess_store, 0, sizeof(struct sr_store)); - + fd_list_init(&conn->cc_sctp3436_data.sess_store->list, NULL); CHECK_POSIX( pthread_rwlock_init(&conn->cc_sctp3436_data.sess_store->lock, NULL) ); conn->cc_sctp3436_data.sess_store->parent = conn; - + return 0; } @@ -341,12 +341,12 @@ /* Del all list entries */ TRACE_ENTRY("%p", conn); CHECK_PARAMS_DO( conn, return ); - + if (!conn->cc_sctp3436_data.sess_store) return; - + CHECK_POSIX_DO( pthread_rwlock_destroy(&conn->cc_sctp3436_data.sess_store->lock), /* continue */ ); - + while (!FD_IS_LIST_EMPTY(&conn->cc_sctp3436_data.sess_store->list)) { struct sr_data * sr = (struct sr_data *) conn->cc_sctp3436_data.sess_store->list.next; fd_list_unlink( &sr->chain ); @@ -354,7 +354,7 @@ free(sr->data.data); free(sr); } - + free(conn->cc_sctp3436_data.sess_store); conn->cc_sctp3436_data.sess_store = NULL; return; @@ -365,21 +365,21 @@ { struct fd_list * ret; *match = 0; - + for (ret = sto->list.next; ret != &sto->list; ret = ret->next) { int cmp = 0; struct sr_data * sr = (struct sr_data *)ret; - + cmp = fd_os_cmp(key.data, key.size, sr->key.data, sr->key.size); if (cmp > 0) continue; - + if (cmp == 0) *match = 1; - + break; } - + return ret; } @@ -391,31 +391,31 @@ struct sr_data * sr; int match = 0; int ret = 0; - + TRACE_DEBUG( GNUTLS_DBG_LEVEL, "GNUTLS Callback: %s", __PRETTY_FUNCTION__ ); CHECK_PARAMS_DO( sto && key.data && data.data, return -1 ); - + CHECK_POSIX_DO( pthread_rwlock_wrlock(&sto->lock), return -1 ); TRACE_BUFFER(FD_LOG_DEBUG, GNUTLS_DBG_LEVEL, "Session store [key ", key.data, key.size, "]"); - + li = find_or_next(sto, key, &match); if (match) { sr = (struct sr_data *)li; - + /* Check the data is the same */ if ((data.size != sr->data.size) || memcmp(data.data, sr->data.data, data.size)) { TRACE_DEBUG(INFO, "GnuTLS tried to store a session with same key and different data!"); TRACE_BUFFER(FD_LOG_DEBUG, INFO, "Session store [key ", key.data, key.size, "]"); TRACE_BUFFER(FD_LOG_DEBUG, INFO, " -- old data [", sr->data.data, sr->data.size, "]"); TRACE_BUFFER(FD_LOG_DEBUG, INFO, " -- new data [", data.data, data.size, "]"); - + ret = -1; } else { TRACE_DEBUG(GNUTLS_DBG_LEVEL, "GnuTLS tried to store a session with same key and same data, skipped."); } goto out; } - + /* Create a new entry */ CHECK_MALLOC_DO( sr = malloc(sizeof(struct sr_data)), { ret = -1; goto out; } ); memset(sr, 0, sizeof(struct sr_data)); @@ -429,11 +429,11 @@ CHECK_MALLOC_DO( sr->data.data = malloc(data.size), { ret = -1; goto out; } ); sr->data.size = data.size; memcpy(sr->data.data, data.data, data.size); - + /* Save this new entry in the list, we are done */ fd_list_insert_before(li, &sr->chain); -out: +out: CHECK_POSIX_DO( pthread_rwlock_unlock(&sto->lock), return -1 ); return ret; } @@ -445,17 +445,17 @@ struct sr_data * sr; int match = 0; int ret = 0; - + TRACE_DEBUG( GNUTLS_DBG_LEVEL, "GNUTLS Callback: %s", __PRETTY_FUNCTION__ ); CHECK_PARAMS_DO( sto && key.data, return -1 ); - + CHECK_POSIX_DO( pthread_rwlock_wrlock(&sto->lock), return -1 ); TRACE_BUFFER(FD_LOG_DEBUG, GNUTLS_DBG_LEVEL, "Session delete [key ", key.data, key.size, "]"); - + li = find_or_next(sto, key, &match); if (match) { sr = (struct sr_data *)li; - + /* Destroy this data */ fd_list_unlink(li); free(sr->key.data); @@ -465,7 +465,7 @@ /* It was not found */ ret = -1; } - + CHECK_POSIX_DO( pthread_rwlock_unlock(&sto->lock), return -1 ); return ret; } @@ -484,7 +484,7 @@ CHECK_POSIX_DO( pthread_rwlock_rdlock(&sto->lock), return error ); TRACE_BUFFER(FD_LOG_DEBUG, GNUTLS_DBG_LEVEL, "Session fetch [key ", key.data, key.size, "]"); - + li = find_or_next(sto, key, &match); if (match) { sr = (struct sr_data *)li; @@ -492,7 +492,7 @@ res.size = sr->data.size; memcpy(res.data, sr->data.data, res.size); } -out: +out: TRACE_DEBUG(GNUTLS_DBG_LEVEL, "Fetched (%p, %d) from store %p", res.data, res.size, sto); CHECK_POSIX_DO( pthread_rwlock_unlock(&sto->lock), return error); return res; @@ -502,12 +502,12 @@ static void set_resume_callbacks(gnutls_session_t session, struct cnxctx * conn) { TRACE_ENTRY("%p", conn); - + GNUTLS_TRACE( gnutls_db_set_retrieve_function(session, sr_fetch)); GNUTLS_TRACE( gnutls_db_set_remove_function (session, sr_remove)); GNUTLS_TRACE( gnutls_db_set_store_function (session, sr_store)); GNUTLS_TRACE( gnutls_db_set_ptr (session, conn->cc_sctp3436_data.sess_store)); - + return; } @@ -516,20 +516,20 @@ { struct sctp3436_ctx * ctx = (struct sctp3436_ctx *) arg; int resumed; - + TRACE_ENTRY("%p", arg); - + /* Set the thread name */ { char buf[48]; snprintf(buf, sizeof(buf), "Handshake resume (%hu@%d)", ctx->strid, ctx->parent->cc_socket); fd_log_threadname ( buf ); } - + TRACE_DEBUG(FULL, "Starting TLS resumed handshake on stream %hu", ctx->strid); CHECK_GNUTLS_DO( gnutls_handshake( ctx->session ), return NULL); - + GNUTLS_TRACE( resumed = gnutls_session_is_resumed(ctx->session) ); #ifndef GNUTLS_VERSION_300 if (!resumed) { @@ -544,7 +544,7 @@ fd_log_debug("Session was NOT resumed on stream %hu (full handshake) (conn: '%s')", ctx->strid, fd_cnx_getid(ctx->parent)); } } - + /* Finished, OK */ return arg; } @@ -558,10 +558,10 @@ int fd_sctp3436_init(struct cnxctx * conn) { uint16_t i; - + TRACE_ENTRY("%p", conn); CHECK_PARAMS( conn && (conn->cc_sctp_para.pairs > 1) && (!conn->cc_sctp3436_data.array) ); - + /* First, alloc the array and initialize the non-TLS data */ CHECK_MALLOC( conn->cc_sctp3436_data.array = calloc(conn->cc_sctp_para.pairs, sizeof(struct sctp3436_ctx)) ); for (i = 0; i < conn->cc_sctp_para.pairs; i++) { @@ -569,23 +569,23 @@ conn->cc_sctp3436_data.array[i].strid = i; CHECK_FCT( fd_fifo_new(&conn->cc_sctp3436_data.array[i].raw_recv, 10) ); } - + /* Set push/pull functions in the master session, using fifo in array[0] */ set_sess_transport(conn->cc_tls_para.session, &conn->cc_sctp3436_data.array[0]); - + /* For server side, we also initialize the resuming capabilities */ if (conn->cc_tls_para.mode == GNUTLS_SERVER) { - + /* Prepare the store for sessions data */ CHECK_FCT( store_init(conn) ); - + /* Set the callbacks for resuming in the master session */ set_resume_callbacks(conn->cc_tls_para.session, conn); } /* Start the demux thread */ CHECK_POSIX( pthread_create( &conn->cc_rcvthr, NULL, demuxer, conn ) ); - + return 0; } @@ -595,13 +595,13 @@ uint16_t i; int errors = 0; gnutls_datum_t master_data; - + TRACE_ENTRY("%p %p", conn, priority); CHECK_PARAMS( conn && (conn->cc_sctp_para.pairs > 1) && conn->cc_sctp3436_data.array ); /* Server side: we set all the parameters, the resume callback will take care of resuming the session */ /* Client side: we duplicate the parameters of the master session, then set the transport pointer */ - + /* For client side, retrieve the master session parameters */ if (conn->cc_tls_para.mode == GNUTLS_CLIENT) { CHECK_GNUTLS_DO( gnutls_session_get_data2(conn->cc_tls_para.session, &master_data), return ENOMEM ); @@ -613,12 +613,12 @@ TRACE_BUFFER(FD_LOG_DEBUG, GNUTLS_DBG_LEVEL, "Master session id: [", id, ids, "]"); } } - + /* Initialize the session objects and start the handshake in a separate thread */ for (i = 1; i < conn->cc_sctp_para.pairs; i++) { /* Set credentials and priority */ CHECK_FCT( fd_tls_prepare(&conn->cc_sctp3436_data.array[i].session, conn->cc_tls_para.mode, 0, priority, alt_creds) ); - + /* additional initialization for gnutls 3.x */ #ifdef GNUTLS_VERSION_300 /* the verify function has already been set in the global initialization in config.c */ @@ -643,19 +643,19 @@ } else { set_resume_callbacks(conn->cc_sctp3436_data.array[i].session, conn); } - + /* Set transport parameters */ set_sess_transport(conn->cc_sctp3436_data.array[i].session, &conn->cc_sctp3436_data.array[i]); - + /* Start the handshake thread */ CHECK_POSIX( pthread_create( &conn->cc_sctp3436_data.array[i].thr, NULL, handshake_resume_th, &conn->cc_sctp3436_data.array[i] ) ); } - + /* We can now release the memory of master session data if any */ if (conn->cc_tls_para.mode == GNUTLS_CLIENT) { GNUTLS_TRACE( gnutls_free(master_data.data) ); } - + /* Now wait for all handshakes to finish */ for (i = 1; i < conn->cc_sctp_para.pairs; i++) { void * ret; @@ -665,13 +665,13 @@ errors++; /* Handshake failed on this stream */ } } - + if (errors) { TRACE_DEBUG(INFO, "Handshake failed on %d/%hd stream pairs", errors, conn->cc_sctp_para.pairs); fd_cnx_markerror(conn); return ENOTCONN; } - + return 0; } @@ -679,10 +679,10 @@ int fd_sctp3436_startthreads(struct cnxctx * conn, int others) { uint16_t i; - + TRACE_ENTRY("%p", conn); CHECK_PARAMS( conn && conn->cc_sctp3436_data.array ); - + if (others) { for (i = 1; i < conn->cc_sctp_para.pairs; i++) { @@ -699,9 +699,9 @@ void fd_sctp3436_bye(struct cnxctx * conn) { uint16_t i; - + CHECK_PARAMS_DO( conn && conn->cc_sctp3436_data.array, return ); - + /* End all TLS sessions, in series (not as efficient as paralel, but simpler) */ for (i = 1; i < conn->cc_sctp_para.pairs; i++) { if ( ! fd_cnx_teststate(conn, CC_STATUS_ERROR)) { @@ -714,10 +714,10 @@ void fd_sctp3436_waitthreadsterm(struct cnxctx * conn) { uint16_t i; - + TRACE_ENTRY("%p", conn); CHECK_PARAMS_DO( conn && conn->cc_sctp3436_data.array, return ); - + for (i = 0; i < conn->cc_sctp_para.pairs; i++) { if (conn->cc_sctp3436_data.array[i].thr != (pthread_t)NULL) { CHECK_POSIX_DO( pthread_join(conn->cc_sctp3436_data.array[i].thr, NULL), /* continue */ ); @@ -731,10 +731,10 @@ void fd_sctp3436_gnutls_deinit_others(struct cnxctx * conn) { uint16_t i; - + TRACE_ENTRY("%p", conn); CHECK_PARAMS_DO( conn && conn->cc_sctp3436_data.array, return ); - + for (i = 1; i < conn->cc_sctp_para.pairs; i++) { if (conn->cc_sctp3436_data.array[i].session) { GNUTLS_TRACE( gnutls_deinit(conn->cc_sctp3436_data.array[i].session) ); @@ -748,10 +748,10 @@ void fd_sctp3436_stopthreads(struct cnxctx * conn) { uint16_t i; - + TRACE_ENTRY("%p", conn); CHECK_PARAMS_DO( conn && conn->cc_sctp3436_data.array, return ); - + for (i = 0; i < conn->cc_sctp_para.pairs; i++) { CHECK_FCT_DO( fd_thr_term(&conn->cc_sctp3436_data.array[i].thr), /* continue */ ); } @@ -762,15 +762,15 @@ void fd_sctp3436_destroy(struct cnxctx * conn) { uint16_t i; - + CHECK_PARAMS_DO( conn && conn->cc_sctp3436_data.array, return ); - + /* Terminate all receiving threads in case we did not do it yet */ fd_sctp3436_stopthreads(conn); - + /* Now, stop the demux thread */ CHECK_FCT_DO( fd_thr_term(&conn->cc_rcvthr), /* continue */ ); - + /* Free remaining data in the array */ for (i = 0; i < conn->cc_sctp_para.pairs; i++) { if (conn->cc_sctp3436_data.array[i].raw_recv) @@ -781,13 +781,13 @@ conn->cc_sctp3436_data.array[i].session = NULL; } } - + /* Free the array itself now */ free(conn->cc_sctp3436_data.array); conn->cc_sctp3436_data.array = NULL; - + /* Delete the store of sessions */ store_destroy(conn); - + return ; }