282 lines
14 KiB
C
282 lines
14 KiB
C
/*
|
|
* 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");
|