view extensions/dict_dcca_starent/dict_dcca_starent.c @ 1327:82b386714795

Set callback data also when only setting expire callback (and not answer callback as well). It is used when calling the expire callback, so not setting it makes no sense.
author Thomas Klausner <tk@giga.or.at>
date Mon, 27 Nov 2017 15:21:20 +0100
parents 729e5074839f
children 4bd30996ad7f
line wrap: on
line source

/* 
 * 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, "Enumerated(Starent/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, "Enumerated(Starent/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, "Enumerated(Starent/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");
"Welcome to our mercurial repository"