Mercurial > hg > freeDiameter
view contrib/dict_dcca/dict_dcca_nokia.c @ 1462:b573eda8f4a2
LICENSE: add Luke Mewburn as contributor
author | Luke Mewburn <luke@mewburn.net> |
---|---|
date | Mon, 09 Mar 2020 21:33:11 +1100 |
parents | 42d0a08cffa8 |
children |
line wrap: on
line source
/* * Dictionary definitions of objects specified in DCCA (Nokia, 3GPP). */ #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 ) #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, \ (_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_nokia_entry(char * conffile) { TRACE_ENTRY("%p", conffile); /* Applications section */ { /* Create the vendors */ { struct dict_vendor_data vendor_data = { 94, "Nokia" }; CHECK_FCT(fd_dict_new(fd_g_config->cnf_dict, DICT_VENDOR, &vendor_data, NULL, NULL)); } } /* AVP section */ { struct dict_object * Address_type; struct dict_object * UTF8String_type; struct dict_object * DiameterIdentity_type; struct dict_object * DiameterURI_type; struct dict_object * Time_type; CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "Address", &Address_type); CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "UTF8String", &UTF8String_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, "Time", &Time_type); /* NSN-Token-Value */ { /* OctetString. A token that was received, for example, from the subscription portal [14]. The maximum length of the token is 64 octets. When this AVP is included in the MSCC, the USU and Reporting-Reason AVPs will not be included (because the token is not a trigger to report quota usage). Additionally, the Rating-Group and Service-Id AVPs will have the values received from the subscription portal. */ struct dict_avp_data data = { 5113, /* Code */ 94, /* Vendor */ "NSN-Token-Value", /* Name */ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ AVP_TYPE_OCTETSTRING /* base type of data */ }; CHECK_dict_new( DICT_AVP, &data , NULL, NULL); } /* Quota-Consumption-Time */ { /* Unsigned32. Contains the time quota envelope expiration time in seconds. This is the time elapsed from the previous service request, to the moment the Flexi ISN considers that the time envelope finishes. The value of this AVP will be in effect for the remainder of the session or until a new value is received. If this AVP is not present, the default value configured for the rating group will be used. The OCS may disable the time quota envelope expiration by setting the value of this AVP to 0. The value of QCT sent from the OCS for a certain MSCC instance is stored in the Flexi ISN and it is used if the OCS does not sent a new value in the CCAs that follow */ struct dict_avp_data data = { 5109, /* Code */ 94, /* Vendor */ "Quota-Consumption-Time", /* Name */ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ AVP_TYPE_UNSIGNED32 /* base type of data */ }; CHECK_dict_new( DICT_AVP, &data , NULL, NULL); } /* Quota-Holding-Time */ { /* Unsigned32. Indicates how long the Flexi ISN will keep the granted quota after a service request has been received. The unit is in seconds. When this time elapses, the Flexi ISN ends the MSCC instance and reports the used quota without requesting more. The value of this AVP will be in effect for the remainder of the session or until a new value is received. If this AVP is not present, the default value con- figured for the rating group will be used. The OCS may disable the Quota Holding Timer by setting the value of this AVP to 0. The value of the QHT sent from the OCS for a certain MSCC instance is stored in the Flexi ISN, and it is used if the OCS does not sent a new value in the CCAs that follow. */ struct dict_avp_data data = { 5110, /* Code */ 94, /* Vendor */ "Quota-Holding-Time", /* Name */ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ AVP_TYPE_UNSIGNED32 /* base type of data */ }; CHECK_dict_new( DICT_AVP, &data , NULL, NULL); } /* Default-Quota */ { /* Grouped. Indicates the absolute number of units that are available for consumption during each upcoming OCS interrogation (e.g. after a CCR has been sent but before the CCA is received). If this AVP is not present, the Flexi ISN will use the configured or earlier received default quota. If this AVP is present but does not include the default quota for a certain unit type, that unit type is considered to have no default quota. The usage of default quota can be disabled in certain situations by modifying the Flexi ISN settings */ struct dict_avp_data data = { 5111, /* Code */ 94, /* Vendor */ "Default-Quota", /* Name */ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */ AVP_TYPE_GROUPED /* base type of data */ }; CHECK_dict_new( DICT_AVP, &data , NULL, NULL); } /* Session-Start-Indicator */ { /* OctetString. (3GPP TS 29.061 Rel4). The address of the charging gateway that has been marked as the default charging gateway for the PDP context. The address is expressed as a four-byte integer. Present in the initial CCR only. */ struct dict_avp_data data = { 5105, /* Code */ 94, /* Vendor */ "Session-Start-Indicator", /* Name */ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ AVP_FLAG_VENDOR, /* Fixed flag values */ AVP_TYPE_OCTETSTRING /* base type of data */ }; CHECK_dict_new( DICT_AVP, &data , NULL, NULL); } /* Rulebase-id */ { /* */ struct dict_avp_data data = { 5106, /* Code */ 94, /* Vendor */ "Rulebase-id", /* Name */ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ AVP_FLAG_VENDOR, /* Fixed flag values */ AVP_TYPE_OCTETSTRING /* base type of data */ }; CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL); } /* Time-Of-First-Usage */ { /* Time. Contains a time-stamp identifying the date and time of the first increment of the used units counter since the previous report. If no used units were gathered during the previous reporting inter- val, this AVP will not be present. */ struct dict_avp_data data = { 5103, /* Code */ 94, /* Vendor */ "Time-Of-First-Usage", /* Name */ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ AVP_FLAG_VENDOR, /* Fixed flag values */ AVP_TYPE_OCTETSTRING /* base type of data */ }; CHECK_dict_new( DICT_AVP, &data , Time_type, NULL); } /* Time-Of-Last-Usage */ { /* Time. Contains a time-stamp identifying the date and time of the first increment of the used units counter since the previous report. If no used units were gathered during the previous reporting inter- val, this AVP will not be present. */ struct dict_avp_data data = { 5104, /* Code */ 94, /* Vendor */ "Time-Of-Last-Usage", /* Name */ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */ AVP_FLAG_VENDOR, /* Fixed flag values */ AVP_TYPE_OCTETSTRING /* base type of data */ }; CHECK_dict_new( DICT_AVP, &data , Time_type, NULL); } } TRACE_DEBUG(INFO, "Extension 'Dictionary definitions for DCCA Nokia' initialized"); return 0; } EXTENSION_ENTRY("dict_dcca_nokia", dict_dcca_nokia_entry, "dict_dcca");