blob: 5ff742011c31fc41421355be091c73fb8f27e214 [file] [log] [blame]
/*
* 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");