| /* |
| * Dictionary definitions of objects specified in DCCA by Starent. |
| */ |
| #include <freeDiameter/extension.h> |
| |
| |
| /* The content of this file follows the same structure as dict_base_proto.c */ |
| |
| #define CHECK_dict_new( _type, _data, _parent, _ref ) \ |
| CHECK_FCT( fd_dict_new( fd_g_config->cnf_dict, (_type), (_data), (_parent), (_ref)) ); |
| |
| #define CHECK_dict_search( _type, _criteria, _what, _result ) \ |
| CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) ); |
| |
| struct local_rules_definition { |
| char *avp_name; |
| enum rule_position position; |
| int min; |
| int max; |
| }; |
| |
| #define RULE_ORDER( _position ) ((((_position) == RULE_FIXED_HEAD) || ((_position) == RULE_FIXED_TAIL)) ? 1 : 0 ) |
| |
| /* Attention! This version of the macro uses AVP_BY_NAME_ALL_VENDORS, in contrast to most other copies! */ |
| #define PARSE_loc_rules( _rulearray, _parent) { \ |
| int __ar; \ |
| for (__ar=0; __ar < sizeof(_rulearray) / sizeof((_rulearray)[0]); __ar++) { \ |
| struct dict_rule_data __data = { NULL, \ |
| (_rulearray)[__ar].position, \ |
| 0, \ |
| (_rulearray)[__ar].min, \ |
| (_rulearray)[__ar].max}; \ |
| __data.rule_order = RULE_ORDER(__data.rule_position); \ |
| CHECK_FCT( fd_dict_search( \ |
| fd_g_config->cnf_dict, \ |
| DICT_AVP, \ |
| AVP_BY_NAME_ALL_VENDORS, \ |
| (_rulearray)[__ar].avp_name, \ |
| &__data.rule_avp, 0 ) ); \ |
| if ( !__data.rule_avp ) { \ |
| TRACE_DEBUG(INFO, "AVP Not found: '%s'", (_rulearray)[__ar].avp_name ); \ |
| return ENOENT; \ |
| } \ |
| CHECK_FCT_DO( fd_dict_new( fd_g_config->cnf_dict, DICT_RULE, &__data, _parent, NULL), \ |
| { \ |
| TRACE_DEBUG(INFO, "Error on rule with AVP '%s'", \ |
| (_rulearray)[__ar].avp_name ); \ |
| return EINVAL; \ |
| } ); \ |
| } \ |
| } |
| |
| #define enumval_def_u32( _val_, _str_ ) \ |
| { _str_, { .u32 = _val_ }} |
| |
| #define enumval_def_os( _len_, _val_, _str_ ) \ |
| { _str_, { .os = { .data = (unsigned char *)_val_, .len = _len_ }}} |
| |
| |
| static int dict_dcca_starent_entry(char * conffile) |
| { |
| /* Applications section */ |
| { |
| /* Create the vendors */ |
| { |
| struct dict_vendor_data vendor_data = { 8164, "Starent" }; |
| CHECK_FCT(fd_dict_new(fd_g_config->cnf_dict, DICT_VENDOR, &vendor_data, NULL, NULL)); |
| } |
| |
| } |
| |
| |
| struct dict_object * Address_type; |
| struct dict_object * DiameterIdentity_type; |
| struct dict_object * DiameterURI_type; |
| struct dict_object * IPFilterRule_type; |
| struct dict_object * Time_type; |
| struct dict_object * UTF8String_type; |
| |
| CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "Address", &Address_type); |
| CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "DiameterIdentity", &DiameterIdentity_type); |
| CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "DiameterURI", &DiameterURI_type); |
| CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "IPFilterRule", &IPFilterRule_type); |
| CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "Time", &Time_type); |
| CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "UTF8String", &UTF8String_type); |
| |
| /* The following is created automatically. Do not modify. */ |
| /* Changes will be lost during the next update. Modify the source org file instead. */ |
| |
| /* Cisco ASR 5000 Series AAA Interface */ |
| /* Administration and Reference */ |
| /* Release 8.x and 9.0 */ |
| /* Last Updated June 30, 2010 */ |
| /* updated using v15 docs from Jan 2014 */ |
| /* www.cisco.com/c/dam/en/us/td/docs/wireless/asr_5000/15-0/15-0-AAA-Reference.pdf */ |
| /* SN-Volume-Quota-Threshold */ |
| { |
| struct dict_avp_data data = { |
| 501, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Volume-Quota-Threshold", /* Name */ |
| AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ |
| AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ |
| AVP_TYPE_UNSIGNED32 /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, NULL, NULL); |
| }; |
| |
| /* SN-Unit-Quota-Threshold */ |
| { |
| struct dict_avp_data data = { |
| 502, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Unit-Quota-Threshold", /* Name */ |
| AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ |
| AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ |
| AVP_TYPE_UNSIGNED32 /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, NULL, NULL); |
| }; |
| |
| /* SN-Time-Quota-Threshold */ |
| { |
| struct dict_avp_data data = { |
| 503, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Time-Quota-Threshold", /* Name */ |
| AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ |
| AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ |
| AVP_TYPE_UNSIGNED32 /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, NULL, NULL); |
| }; |
| |
| /* SN-Total-Used-Service-Unit */ |
| { |
| struct dict_avp_data data = { |
| 504, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Total-Used-Service-Unit", /* Name */ |
| AVP_FLAG_VENDOR, /* Fixed flags */ |
| AVP_FLAG_VENDOR, /* Fixed flag values */ |
| AVP_TYPE_GROUPED /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, NULL, NULL); |
| }; |
| |
| /* SN-Absolute-Validity-Time */ |
| { |
| struct dict_avp_data data = { |
| 505, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Absolute-Validity-Time", /* Name */ |
| AVP_FLAG_VENDOR, /* Fixed flags */ |
| AVP_FLAG_VENDOR, /* Fixed flag values */ |
| AVP_TYPE_OCTETSTRING /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); |
| }; |
| |
| /* SN-Bandwidth-Control */ |
| { |
| struct dict_avp_data data = { |
| 512, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Bandwidth-Control", /* Name */ |
| AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ |
| AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ |
| AVP_TYPE_INTEGER32 /* base type of data */ |
| }; |
| struct dict_object *type; |
| struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Starent/Enumerated(SN-Bandwidth-Control)", NULL, NULL, NULL }; |
| CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); |
| CHECK_dict_new(DICT_AVP, &data, type, NULL); |
| }; |
| |
| /* SN-Transparent-Data */ |
| { |
| struct dict_avp_data data = { |
| 513, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Transparent-Data", /* Name */ |
| AVP_FLAG_VENDOR, /* Fixed flags */ |
| AVP_FLAG_VENDOR, /* Fixed flag values */ |
| AVP_TYPE_OCTETSTRING /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, NULL, NULL); |
| }; |
| |
| /* SN-Traffic-Policy */ |
| { |
| struct dict_avp_data data = { |
| 514, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Traffic-Policy", /* Name */ |
| AVP_FLAG_VENDOR, /* Fixed flags */ |
| AVP_FLAG_VENDOR, /* Fixed flag values */ |
| AVP_TYPE_OCTETSTRING /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); |
| }; |
| |
| /* SN-Firewall-Policy */ |
| { |
| struct dict_avp_data data = { |
| 515, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Firewall-Policy", /* Name */ |
| AVP_FLAG_VENDOR, /* Fixed flags */ |
| AVP_FLAG_VENDOR, /* Fixed flag values */ |
| AVP_TYPE_OCTETSTRING /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); |
| }; |
| |
| /* SN-Usage-Monitoring-Control */ |
| { |
| struct dict_avp_data data = { |
| 517, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Usage-Monitoring-Control", /* Name */ |
| AVP_FLAG_VENDOR, /* Fixed flags */ |
| AVP_FLAG_VENDOR, /* Fixed flag values */ |
| AVP_TYPE_GROUPED /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, NULL, NULL); |
| }; |
| |
| /* SN-Monitoring-Key */ |
| { |
| struct dict_avp_data data = { |
| 518, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Monitoring-Key", /* Name */ |
| AVP_FLAG_VENDOR, /* Fixed flags */ |
| AVP_FLAG_VENDOR, /* Fixed flag values */ |
| AVP_TYPE_UNSIGNED32 /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, NULL, NULL); |
| }; |
| |
| /* SN-Usage-Volume */ |
| { |
| struct dict_avp_data data = { |
| 519, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Usage-Volume", /* Name */ |
| AVP_FLAG_VENDOR, /* Fixed flags */ |
| AVP_FLAG_VENDOR, /* Fixed flag values */ |
| AVP_TYPE_UNSIGNED64 /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, NULL, NULL); |
| }; |
| |
| /* SN-Service-Flow-Detection */ |
| { |
| struct dict_avp_data data = { |
| 520, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Service-Flow-Detection", /* Name */ |
| AVP_FLAG_VENDOR, /* Fixed flags */ |
| AVP_FLAG_VENDOR, /* Fixed flag values */ |
| AVP_TYPE_INTEGER32 /* base type of data */ |
| }; |
| struct dict_object *type; |
| struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Starent/Enumerated(SN-Service-Flow-Detection)", NULL, NULL, NULL }; |
| CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); |
| CHECK_dict_new(DICT_AVP, &data, type, NULL); |
| }; |
| |
| /* SN-Usage-Monitoring */ |
| { |
| struct dict_avp_data data = { |
| 521, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Usage-Monitoring", /* Name */ |
| AVP_FLAG_VENDOR, /* Fixed flags */ |
| AVP_FLAG_VENDOR, /* Fixed flag values */ |
| AVP_TYPE_INTEGER32 /* base type of data */ |
| }; |
| struct dict_object *type; |
| struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Starent/Enumerated(SN-Usage-Monitoring)", NULL, NULL, NULL }; |
| CHECK_dict_new(DICT_TYPE, &tdata, NULL, &type); |
| CHECK_dict_new(DICT_AVP, &data, type, NULL); |
| }; |
| |
| /* SN-Session-Start-Indicator */ |
| { |
| struct dict_avp_data data = { |
| 522, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Session-Start-Indicator", /* Name */ |
| AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ |
| AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ |
| AVP_TYPE_OCTETSTRING /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, NULL, NULL); |
| }; |
| |
| /* SN-Phase0-PSAPName */ |
| { |
| struct dict_avp_data data = { |
| 523, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Phase0-PSAPName", /* Name */ |
| AVP_FLAG_VENDOR, /* Fixed flags */ |
| AVP_FLAG_VENDOR, /* Fixed flag values */ |
| AVP_TYPE_OCTETSTRING /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); |
| }; |
| |
| /* SN-Charging-Id */ |
| { |
| struct dict_avp_data data = { |
| 525, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Charging-Id", /* Name */ |
| AVP_FLAG_VENDOR, /* Fixed flags */ |
| AVP_FLAG_VENDOR, /* Fixed flag values */ |
| AVP_TYPE_OCTETSTRING /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, NULL, NULL); |
| }; |
| |
| /* SN-Remaining-Service-Unit */ |
| { |
| struct dict_avp_data data = { |
| 526, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Remaining-Service-Unit", /* Name */ |
| AVP_FLAG_VENDOR, /* Fixed flags */ |
| AVP_FLAG_VENDOR, /* Fixed flag values */ |
| AVP_TYPE_GROUPED /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, NULL, NULL); |
| }; |
| |
| /* SN-Service-Start-Timestamp */ |
| { |
| struct dict_avp_data data = { |
| 527, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Service-Start-Timestamp", /* Name */ |
| AVP_FLAG_VENDOR, /* Fixed flags */ |
| AVP_FLAG_VENDOR, /* Fixed flag values */ |
| AVP_TYPE_OCTETSTRING /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, Time_type, NULL); |
| }; |
| |
| /* SN-Rulebase-Id */ |
| { |
| struct dict_avp_data data = { |
| 528, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Rulebase-Id", /* Name */ |
| AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ |
| AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ |
| AVP_TYPE_OCTETSTRING /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); |
| }; |
| |
| /* SN-CF-Policy-ID */ |
| { |
| struct dict_avp_data data = { |
| 529, /* Code */ |
| 8164, /* Vendor */ |
| "SN-CF-Policy-ID", /* Name */ |
| AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ |
| AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ |
| AVP_TYPE_UNSIGNED32 /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, NULL, NULL); |
| }; |
| |
| /* SN-Charging-Collection-Function-Name */ |
| { |
| struct dict_avp_data data = { |
| 530, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Charging-Collection-Function-Name", /* Name */ |
| AVP_FLAG_VENDOR, /* Fixed flags */ |
| AVP_FLAG_VENDOR, /* Fixed flag values */ |
| AVP_TYPE_OCTETSTRING /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, UTF8String_type, NULL); |
| }; |
| |
| /* SN-Fast-Reauth-Username */ |
| { |
| struct dict_avp_data data = { |
| 11010, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Fast-Reauth-Username", /* Name */ |
| AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ |
| AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ |
| AVP_TYPE_OCTETSTRING /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, NULL, NULL); |
| }; |
| |
| /* SN-Pseudonym-Username */ |
| { |
| struct dict_avp_data data = { |
| 11011, /* Code */ |
| 8164, /* Vendor */ |
| "SN-Pseudonym-Username", /* Name */ |
| AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flags */ |
| AVP_FLAG_VENDOR |AVP_FLAG_MANDATORY, /* Fixed flag values */ |
| AVP_TYPE_OCTETSTRING /* base type of data */ |
| }; |
| CHECK_dict_new(DICT_AVP, &data, NULL, NULL); |
| }; |
| |
| |
| |
| /* Rules section */ |
| |
| /* SN-Remaining-Service-Unit */ |
| { |
| struct dict_object *rule_avp; |
| struct dict_avp_request vpa; |
| vpa.avp_vendor = 8164; |
| vpa.avp_name = "SN-Remaining-Service-Unit"; |
| CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); |
| struct local_rules_definition rules[] = { |
| { "Tariff-Change-Usage", RULE_OPTIONAL, -1, 1 }, |
| { "CC-Time", RULE_OPTIONAL, -1, 1 }, |
| { "CC-Total-Octets", RULE_OPTIONAL, -1, 1 }, |
| { "CC-Input-Octets", RULE_OPTIONAL, -1, 1 }, |
| { "CC-Output-Octets", RULE_OPTIONAL, -1, 1 }, |
| { "CC-Service-Specific-Units", RULE_OPTIONAL, -1, 1 }, |
| { "Reporting-Reason", RULE_OPTIONAL, -1, 1 } |
| }; |
| PARSE_loc_rules( rules, rule_avp ); |
| } |
| |
| /* SN-Total-Used-Service-Unit */ |
| { |
| struct dict_object *rule_avp; |
| struct dict_avp_request vpa; |
| vpa.avp_vendor = 8164; |
| vpa.avp_name = "SN-Total-Used-Service-Unit"; |
| CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); |
| struct local_rules_definition rules[] = { |
| { "Tariff-Change-Usage", RULE_OPTIONAL, -1, 1 }, |
| { "CC-Time", RULE_OPTIONAL, -1, 1 }, |
| { "CC-Total-Octets", RULE_OPTIONAL, -1, 1 }, |
| { "CC-Input-Octets", RULE_OPTIONAL, -1, 1 }, |
| { "CC-Output-Octets", RULE_OPTIONAL, -1, 1 }, |
| { "CC-Service-Specific-Units", RULE_OPTIONAL, -1, 1 }, |
| { "Reporting-Reason", RULE_OPTIONAL, -1, 1 } |
| }; |
| PARSE_loc_rules( rules, rule_avp ); |
| } |
| |
| /* SN-Usage-Monitoring-Control */ |
| { |
| struct dict_object *rule_avp; |
| struct dict_avp_request vpa; |
| vpa.avp_vendor = 8164; |
| vpa.avp_name = "SN-Usage-Monitoring-Control"; |
| CHECK_dict_search(DICT_AVP, AVP_BY_NAME_AND_VENDOR, &vpa, &rule_avp); |
| struct local_rules_definition rules[] = { |
| { "SN-Monitoring-Key", RULE_OPTIONAL, -1, 1 }, |
| { "SN-Usage-Monitoring", RULE_OPTIONAL, -1, 1 }, |
| { "SN-Usage-Volume", RULE_OPTIONAL, -1, 1 }, |
| }; |
| PARSE_loc_rules( rules, rule_avp ); |
| } |
| |
| LOG_D( "Extension 'Dictionary definitions for DCCA Starent' initialized"); |
| return 0; |
| } |
| |
| EXTENSION_ENTRY("dict_dcca_starent", dict_dcca_starent_entry, "dict_dcca_3gpp"); |