/*********************************************************************************************************
* Software License Agreement (BSD License)                                                               *
* Author: Sebastien Decugis <sdecugis@freediameter.net>							 *
*													 *
* Copyright (c) 2013, WIDE Project and NICT								 *
* All rights reserved.											 *
* 													 *
* Redistribution and use of this software in source and binary forms, with or without modification, are  *
* permitted provided that the following conditions are met:						 *
* 													 *
* * Redistributions of source code must retain the above 						 *
*   copyright notice, this list of conditions and the 							 *
*   following disclaimer.										 *
*    													 *
* * Redistributions in binary form must reproduce the above 						 *
*   copyright notice, this list of conditions and the 							 *
*   following disclaimer in the documentation and/or other						 *
*   materials provided with the distribution.								 *
* 													 *
* * Neither the name of the WIDE Project or NICT nor the 						 *
*   names of its contributors may be used to endorse or 						 *
*   promote products derived from this software without 						 *
*   specific prior written permission of WIDE Project and 						 *
*   NICT.												 *
* 													 *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 	 *
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 	 *
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.								 *
*********************************************************************************************************/

/* 
 * Dictionary definitions of objects specified in Diameter NASREQ (RFC4005).
 */
#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 dnr_entry(char * conffile)
{
	struct dict_object * nasreq;
	TRACE_ENTRY("%p", conffile);
	
	/* No Vendors definitions */
	
	/* Applications section */
	{
		/* NASREQ (RFC 4005) */
		{
			struct dict_application_data data = {        1, "Diameter Network Access Server Application" 			};
			CHECK_dict_new( DICT_APPLICATION, &data, NULL, &nasreq);
		}
	}
	
	/* Derived AVP types section */
	{
		/* QoSFilterRule */
		{
			/*
				The QosFilterRule format is derived from the OctetString AVP Base
				Format.  It uses the ASCII charset.  Packets may be marked or
				metered based on the following information:

				 Direction                          (in or out)
				 Source and destination IP address  (possibly masked)
				 Protocol
				 Source and destination port        (lists or ranges)
				 DSCP values                        (no mask or range)

				Rules for the appropriate direction are evaluated in order; the
				first matched rule terminates the evaluation.  Each packet is
				evaluated once.  If no rule matches, the packet is treated as best
				effort.  An access device unable to interpret or apply a QoS rule
				SHOULD NOT terminate the session.

				QoSFilterRule filters MUST follow the following format:

				action dir proto from src to dst [options]

        				tag    - Mark packet with a specific DSCP
                				 [DIFFSERV].  The DSCP option MUST be
                				 included.
        				meter  - Meter traffic.  The metering options
                				 MUST be included.

				dir           The format is as described under IPFilterRule.

				proto         The format is as described under IPFilterRule.

				src and dst   The format is as described under IPFilterRule.

				 options:

				 DSCP <color>
				       Color values as defined in [DIFFSERV].  Exact
				       matching of DSCP values is required (no masks or
				       ranges).

				 metering <rate> <color_under> <color_over>
				       The metering option provides Assured Forwarding,
				       as defined in [DIFFSERVAF], and MUST be present
				       if the action is set to meter.  The rate option is
				       the throughput, in bits per second, used
				       by the access device to mark packets.  Traffic
				       over the rate is marked with the color_over
				       codepoint, and traffic under the rate is marked
				       with the color_under codepoint.  The color_under
				       and color_over options contain the drop
				       preferences and MUST conform to the recommended
				       codepoint keywords described in [DIFFSERVAF]
				       (e.g., AF13).

				       The metering option also supports the strict
				       limit on traffic required by Expedited
				       Forwarding, as defined in [DIFFSERVEF].  The
				       color_over option may contain the keyword "drop"
				       to prevent forwarding of traffic that exceeds the
				       rate parameter.

				 The rule syntax is a modified subset of ipfw(8) from FreeBSD,
				 and the ipfw.c code may provide a useful base for
				 implementations.
			*/
			struct dict_type_data data = { AVP_TYPE_OCTETSTRING,	"QoSFilterRule"		, NULL			, NULL			};
			CHECK_dict_new( DICT_TYPE, &data , NULL, NULL);
		}
		
	}
	
	/* AVP section */
	{
		struct dict_object * UTF8String_type;
		struct dict_object * IPFilterRule_type;
		struct dict_object * QoSFilterRule_type;
		CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "UTF8String", &UTF8String_type);
		CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "IPFilterRule", &IPFilterRule_type);
		CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "QoSFilterRule", &QoSFilterRule_type);

/********************************
 *  NAS Session AVPs            *
 ********************************/		
		/* NAS-Port */
		{
			/*
				The NAS-Port AVP (AVP Code 5) is of type Unsigned32 and contains the
				physical or virtual port number of the NAS which is authenticating
				the user.  Note that "port" is meant in its sense as a service
				connection on the NAS, not as an IP protocol identifier.

				Either NAS-Port or NAS-Port-Id (AVP Code 87) SHOULD be present in
				AA-Request (AAR) commands if the NAS differentiates among its ports.
			*/
			struct dict_avp_data data = { 
					5, 					/* Code */
					0, 					/* Vendor */
					"NAS-Port", 				/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* NAS-Port-Id */
		{
			/*
				The NAS-Port-Id AVP (AVP Code 87) is of type UTF8String and consists
				of ASCII text identifying the port of the NAS authenticating the
				user.  Note that "port" is meant in its sense as a service connection
				on the NAS, not as an IP protocol identifier.

				Either NAS-Port or NAS-Port-Id SHOULD be present in AA-Request (AAR)
				commands if the NAS differentiates among its ports.  NAS-Port-Id is
				intended for use by NASes that cannot conveniently number their
				ports.
			*/
			struct dict_avp_data data = { 
					87, 					/* Code */
					0, 					/* Vendor */
					"NAS-Port-Id", 				/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL);
		}
		
		/* NAS-Port-Type */
		{
			/*
				The NAS-Port-Type AVP (AVP Code 61) is of type Enumerated and
				contains the type of the port on which the NAS is authenticating the
				user.  This AVP SHOULD be present if the NAS uses the same NAS-Port
				number ranges for different service types concurrently.

				The supported values are defined in [RADIUSTypes].  The following
				list is informational and subject to change by the IANA.
				
				http://www.iana.org/assignments/radius-types
				Sub-registry: Values for RADIUS Attribute 61, NAS-Port-Type
				Reference: [RFC2865]
				
				Extract on 2009.06.01:
				0      Async                                                               [RFC2865]
				1      Sync                                                                [RFC2865]
				2      ISDN Sync                                                           [RFC2865]
				3      ISDN Async V.120                                                    [RFC2865]
				4      ISDN Async V.110                                                    [RFC2865]
				5      Virtual                                                             [RFC2865]
				6      PIAFS                                                               [RFC2865]
				7      HDLC Clear Channel                                                  [RFC2865]
				8      X.25                                                                [RFC2865]
				9      X.75                                                                [RFC2865]
				10     G.3 Fax                                                             [RFC2865]
				11     SDSL - Symmetric DSL                                                [RFC2865]
				12     ADSL-CAP - Asymmetric DSL, Carrierless Amplitude Phase Modulation   [RFC2865]
				13     ADSL-DMT - Asymmetric DSL, Discrete Multi-Tone                      [RFC2865]
				14     IDSL - ISDN Digital Subscriber Line                                 [RFC2865]
				15     Ethernet                                                            [RFC2865]
				16     xDSL - Digital Subscriber Line of unknown type                      [RFC2865]
				17     Cable                                                               [RFC2865]
				18     Wireless - Other                                                    [RFC2865]
				19     Wireless - IEEE 802.11                                              [RFC2865]
				20     Token-Ring                                                          [RFC3580] 
				21     FDDI                                                                [RFC3580]
				22     Wireless - CDMA2000                                                 [McCann] 
				23     Wireless - UMTS                                                     [McCann]
				24     Wireless - 1X-EV                                                    [McCann]
				25     IAPP                                                                [IEEE 802.11F][Kerry]   
				26     FTTP - Fiber to the Premises                                        [Nyce]
				27     Wireless - IEEE 802.16                                              [IEEE 802.16]          12 December 2006
				28     Wireless - IEEE 802.20                                              [IEEE 802.20]          12 December 2006
				29     Wireless - IEEE 802.22                                              [IEEE 802.22]          12 December 2006		
				30     PPPoA - PPP over ATM                                                [RFC4603]
				31     PPPoEoA - PPP over Ethernet over ATM                                [RFC4603]
				32     PPPoEoE - PPP over Ethernet over Ethernet                           [RFC4603]
				33     PPPoEoVLAN - PPP over Ethernet over VLAN                            [RFC4603]
				34     PPPoEoQinQ - PPP over Ethernet over IEEE 802.1QinQ                  [RFC4603]
				35     xPON - Passive Optical Network                                      [Hublet][Yan]           19 June 2007
			*/
			
			struct dict_object 	*type;
			struct dict_type_data 	 tdata = { AVP_TYPE_UNSIGNED32,	"Enumerated(NAS-Port-Type)"	, NULL, NULL};
			struct dict_enumval_data tvals[] = {
				enumval_def_u32( 0, "Async [RFC2865]"),
				enumval_def_u32( 1, "Sync [RFC2865]"),
				enumval_def_u32( 2, "ISDN Sync [RFC2865]"),
				enumval_def_u32( 3, "ISDN Async V.120 [RFC2865]"),
				enumval_def_u32( 4, "ISDN Async V.110 [RFC2865]"),
				enumval_def_u32( 5, "Virtual [RFC2865]"),
				enumval_def_u32( 6, "PIAFS [RFC2865]"),
				enumval_def_u32( 7, "HDLC Clear Channel [RFC2865]"),
				enumval_def_u32( 8, "X.25 [RFC2865]"),
				enumval_def_u32( 9, "X.75 [RFC2865]"),
				enumval_def_u32(10, "G.3 Fax [RFC2865]"),
				enumval_def_u32(11, "SDSL - Symmetric DSL [RFC2865]"),
				enumval_def_u32(12, "ADSL-CAP - Asymmetric DSL, Carrierless Amplitude Phase Modulation [RFC2865]"),
				enumval_def_u32(13, "ADSL-DMT - Asymmetric DSL, Discrete Multi-Tone [RFC2865]"),
				enumval_def_u32(14, "IDSL - ISDN Digital Subscriber Line [RFC2865]"),
				enumval_def_u32(15, "Ethernet [RFC2865]"),
				enumval_def_u32(16, "xDSL - Digital Subscriber Line of unknown type [RFC2865]"),
				enumval_def_u32(17, "Cable [RFC2865]"),
				enumval_def_u32(18, "Wireless - Other [RFC2865]"),
				enumval_def_u32(19, "Wireless - IEEE 802.11 [RFC2865]"),
				enumval_def_u32(20, "Token-Ring [RFC3580]"),
				enumval_def_u32(21, "FDDI [RFC3580]"),
				enumval_def_u32(22, "Wireless - CDMA2000 [McCann]"),
				enumval_def_u32(23, "Wireless - UMTS [McCann]"),
				enumval_def_u32(24, "Wireless - 1X-EV [McCann]"),
				enumval_def_u32(25, "IAPP [IEEE 802.11F][Kerry]"),
				enumval_def_u32(26, "FTTP - Fiber to the Premises [Nyce]"),
				enumval_def_u32(27, "Wireless - IEEE 802.16 [IEEE 802.16]"),
				enumval_def_u32(28, "Wireless - IEEE 802.20 [IEEE 802.20]"),
				enumval_def_u32(29, "Wireless - IEEE 802.22 [IEEE 802.22]"),
				enumval_def_u32(30, "PPPoA - PPP over ATM [RFC4603]"),
				enumval_def_u32(31, "PPPoEoA - PPP over Ethernet over ATM [RFC4603]"),
				enumval_def_u32(32, "PPPoEoE - PPP over Ethernet over Ethernet [RFC4603]"),
				enumval_def_u32(33, "PPPoEoVLAN - PPP over Ethernet over VLAN [RFC4603]"),
				enumval_def_u32(34, "PPPoEoQinQ - PPP over Ethernet over IEEE 802.1QinQ [RFC4603]"),
				enumval_def_u32(35, "xPON - Passive Optical Network [Hublet][Yan]")
			};
			struct dict_avp_data 	data = { 
					61, 					/* Code */
					0, 					/* Vendor */
					"NAS-Port-Type", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,			/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			int i;
			/* Create the Enumerated type, enumerated values, and the AVP */
			CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type);
			for (i = 0; i < sizeof(tvals) / sizeof(tvals[0]); i++) {
				CHECK_dict_new( DICT_ENUMVAL, &tvals[i], type, NULL);
			}
			CHECK_dict_new( DICT_AVP, &data , type, NULL);
		}
		
		/* Called-Station-Id */
		{
			/*
				The Called-Station-Id AVP (AVP Code 30) is of type UTF8String and
				allows the NAS to send the ASCII string describing the layer 2
				address the user contacted in the request.  For dialup access, this
				can be a phone number obtained by using Dialed Number Identification
				(DNIS) or a similar technology.  Note that this may be different from
				the phone number the call comes in on.  For use with IEEE 802 access,
				the Called-Station-Id MAY contain a MAC address formatted as
				described in [RAD802.1X].  It SHOULD only be present in
				authentication and/or authorization requests.

				If the Auth-Request-Type AVP is set to authorization-only and the
				User-Name AVP is absent, the Diameter Server MAY perform
				authorization based on this field.  This can be used by a NAS to
				request whether a call should be answered based on the DNIS.
			*/
			struct dict_avp_data data = { 
					30, 					/* Code */
					0, 					/* Vendor */
					"Called-Station-Id", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL);
		}
		
		/* Calling-Station-Id */
		{
			/*
				The Calling-Station-Id AVP (AVP Code 31) is of type UTF8String and
				allows the NAS to send the ASCII string describing the layer 2
				address from which the user connected in the request.  For dialup
				access, this is the phone number the call came from, using Automatic
				Number Identification (ANI) or a similar technology.  For use with
				IEEE 802 access, the Calling-Station-Id AVP MAY contain a MAC
				address, formated as described in [RAD802.1X].  It SHOULD only be
				present in authentication and/or authorization requests.

				If the Auth-Request-Type AVP is set to authorization-only and the
				User-Name AVP is absent, the Diameter Server MAY perform
				authorization based on this field.  This can be used by a NAS to
				request whether a call should be answered based on the layer 2
				address (ANI, MAC Address, etc.)
			*/
			struct dict_avp_data data = { 
					31, 					/* Code */
					0, 					/* Vendor */
					"Calling-Station-Id", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL);
		}
		
		/* Connect-Info */
		{
			/*
				The Connect-Info AVP (AVP Code 77) is of type UTF8String and is sent
				in the AA-Request message or ACR STOP message.  When sent in the
				Access-Request, it indicates the nature of the user's connection.
				The connection speed SHOULD be included at the beginning of the first
				Connect-Info AVP in the message.  If the transmit and receive
				connection speeds differ, both may be included in the first AVP with
				the transmit speed listed first (the speed the NAS modem transmits
				at), then a slash (/), then the receive speed, and then other
				optional information.

				For example: "28800 V42BIS/LAPM" or "52000/31200 V90"

				More than one Connect-Info attribute may be present in an
				Accounting-Request packet to accommodate expected efforts by the ITU
				to have modems report more connection information in a standard
				format that might exceed 252 octets.

				If sent in the ACR STOP, this attribute may summarize statistics
				relating to session quality.  For example, in IEEE 802.11, the
				Connect-Info attribute may contain information on the number of link
				layer retransmissions.  The exact format of this attribute is
				implementation specific.
			*/
			struct dict_avp_data data = { 
					77, 					/* Code */
					0, 					/* Vendor */
					"Connect-Info", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL);
		}
		
		/* Originating-Line-Info */
		{
			/*
				The Originating-Line-Info AVP (AVP Code 94) is of type OctetString
				and is sent by the NAS system to convey information about the origin
				of the call from an SS7 system.

				The originating line information (OLI) element indicates the nature
				and/or characteristics of the line from which a call originated
				(e.g., pay phone, hotel, cellular).  Telephone companies are starting
				to offer OLI to their customers as an option over Primary Rate
				Interface (PRI).  Internet Service Providers (ISPs) can use OLI in
				addition to Called-Station-Id and Calling-Station-Id attributes to
				differentiate customer calls and to define different services.

				The Value field contains two octets (00 - 99).  ANSI T1.113 and
				BELLCORE 394 can be used for additional information about these
				values and their use.  For more information on current assignment
				values, see [http://www.nanpa.com/number_resource_info/ani_ii_assignments.html].

			*/
			struct dict_object 	*type;
			struct dict_type_data 	 tdata = { AVP_TYPE_OCTETSTRING,	"Enumerated(Originating-Line-Info)"	, NULL, NULL};
			struct dict_enumval_data tvals[] = {
				enumval_def_os( 2, "00", "Plain Old Telephone Service (POTS)"),
				enumval_def_os( 2, "01", "Multiparty Line (more than 2)"),
				enumval_def_os( 2, "02", "ANI Failure"),
				enumval_def_os( 2, "06", "Station Level Rating"),
				enumval_def_os( 2, "07", "Special Operator Handling Required"),
				enumval_def_os( 2, "20", "Automatic Identified Outward Dialing (AIOD)"),
				enumval_def_os( 2, "23", "Coin or Non-Coin"),
				enumval_def_os( 2, "24", "Toll Free Service (Non-Pay Origination)"),
				enumval_def_os( 2, "25", "Toll Free Service (Pay Origination)"),
				enumval_def_os( 2, "27", "Toll Free Service (Coin Control Origination)"),
				enumval_def_os( 2, "29", "Prison/Inmate Service"),
				enumval_def_os( 2, "30", "Intercept (Blank)"),
				enumval_def_os( 2, "31", "Intercept (Trouble)"),
				enumval_def_os( 2, "32", "Intercept (Regular)"),
				enumval_def_os( 2, "34", "Telco Operator Handled Call"),
				enumval_def_os( 2, "52", "Outward Wide Area Telecommunications Service (OUTWATS)"),
				enumval_def_os( 2, "60", "Telecommunications Relay Service (TRS)(Unrestricted)"),
				enumval_def_os( 2, "61", "Cellular/Wireless PCS (Type 1)"),
				enumval_def_os( 2, "62", "Cellular/Wireless PCS (Type 2)"),
				enumval_def_os( 2, "63", "Cellular/Wireless PCS (Roaming)"),
				enumval_def_os( 2, "66", "TRS (Hotel)"),
				enumval_def_os( 2, "67", "TRS (Restricted)"),
				enumval_def_os( 2, "70", "Pay Station, No Coin Control"),
				enumval_def_os( 2, "93", "Access for Private Virtual Network Service")
			};
			struct dict_avp_data data = { 
					94, 					/* Code */
					0, 					/* Vendor */
					"Originating-Line-Info", 		/* Name */
					AVP_FLAG_VENDOR, 			/* Fixed flags */
					0,		 			/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			int i;
			/* Create the Enumerated type, enumerated values, and the AVP */
			CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type);
			for (i = 0; i < sizeof(tvals) / sizeof(tvals[0]); i++) {
				CHECK_dict_new( DICT_ENUMVAL, &tvals[i], type, NULL);
			}
			CHECK_dict_new( DICT_AVP, &data , type, NULL);
		}
		
		/* Reply-Message */
		{
			/*
				The Reply-Message AVP (AVP Code 18) is of type UTF8String and
				contains text that MAY be displayed to the user.  When used in an
				AA-Answer message with a successful Result-Code AVP, it indicates
				success.  When found in an AAA message with a Result-Code other than
				DIAMETER_SUCCESS, the AVP contains a failure message.

				The Reply-Message AVP MAY indicate dialog text to prompt the user
				before another AA-Request attempt.  When used in an AA-Answer with a
				Result-Code of DIAMETER_MULTI_ROUND_AUTH or in an Re-Auth-Request
				message, it MAY contain a dialog text to prompt the user for a
				response.

				Multiple Reply-Messages MAY be included, and if any are displayed,
				they MUST be displayed in the same order as they appear in the
				Diameter message.
			*/
			struct dict_avp_data data = { 
					18, 					/* Code */
					0, 					/* Vendor */
					"Reply-Message", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL);
		}
		
/********************************
 *  NAS Authentication AVPs     *
 ********************************/		
		/* User-Password */
		{
			/*
				The User-Password AVP (AVP Code 2) is of type OctetString and
				contains the password of the user to be authenticated, or the user's
				input in a multi-round authentication exchange.

				The User-Password AVP contains a user password or one-time password
				and therefore represents sensitive information.  As required in
				[BASE], Diameter messages are encrypted by using IPsec or TLS.
				Unless this AVP is used for one-time passwords, the User-Password AVP
				SHOULD NOT be used in untrusted proxy environments without encrypting
				it by using end-to-end security techniques, such as the proposed CMS
				Security [DiamCMS].

				The clear-text password (prior to encryption) MUST NOT be longer than
				128 bytes in length.
			*/
			struct dict_avp_data data = { 
					2, 					/* Code */
					0, 					/* Vendor */
					"User-Password", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Password-Retry */
		{
			/*
				The Password-Retry AVP (AVP Code 75) is of type Unsigned32 and MAY be
				included in the AA-Answer if the Result-Code indicates an
				authentication failure.  The value of this AVP indicates how many
				authentication attempts a user is permitted before being
				disconnected.  This AVP is primarily intended for use when the
				Framed-Protocol AVP (see section 6.10.1) is set to ARAP.
			*/
			struct dict_avp_data data = { 
					75, 					/* Code */
					0, 					/* Vendor */
					"Password-Retry", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Prompt */
		{
			/*
				The Prompt AVP (AVP Code 76) is of type Enumerated and MAY be present
				in the AA-Answer message.  When present, it is used by the NAS to
				determine whether the user's response, when entered, should be
				echoed.

				The supported values are listed in http://www.iana.org/assignments/radius-types
				Sub-registry: Values for RADIUS Attribute 76, Prompt
				Reference: [RFC2869]
			*/
			struct dict_object 	*type;
			struct dict_type_data 	 tdata = { AVP_TYPE_UNSIGNED32,	"Enumerated(Prompt)"	, NULL, NULL};
			struct dict_enumval_data tvals[] = {
				enumval_def_u32( 0, "No Echo [RFC2869]"),
				enumval_def_u32( 1, "Echo [RFC2869]")
			};
			struct dict_avp_data data = { 
					76, 					/* Code */
					0, 					/* Vendor */
					"Prompt", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			int i;
			/* Create the Enumerated type, enumerated values, and the AVP */
			CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type);
			for (i = 0; i < sizeof(tvals) / sizeof(tvals[0]); i++) {
				CHECK_dict_new( DICT_ENUMVAL, &tvals[i], type, NULL);
			}
			CHECK_dict_new( DICT_AVP, &data , type, NULL);
		}
		
		/* CHAP-Algorithm */
		{
			/*
				The CHAP-Algorithm AVP (AVP Code 403) is of type Enumerated and
				contains the algorithm identifier used in the computation of the CHAP
				response [PPPCHAP].  The following values are currently supported:

				CHAP with MD5       5
				 The CHAP response is computed by using the procedure described
				 in [PPPCHAP].  This algorithm requires that the CHAP-Response
				 AVP MUST be present in the CHAP-Auth AVP.
			*/
			struct dict_object 	*type;
			struct dict_type_data 	 tdata = { AVP_TYPE_UNSIGNED32,	"Enumerated(CHAP-Algorithm)"	, NULL, NULL};
			struct dict_enumval_data tvals[] = {
				enumval_def_u32( 5, "CHAP with MD5")
			};
			struct dict_avp_data adata = { 
					403, 					/* Code */
					0, 					/* Vendor */
					"CHAP-Algorithm", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,			/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			int i;
			CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type);
			for (i = 0; i < sizeof(tvals) / sizeof(tvals[0]); i++) {
				CHECK_dict_new( DICT_ENUMVAL, &tvals[i], type, NULL);
			}
			CHECK_dict_new( DICT_AVP, &adata , type, NULL);
		}
		
		/* CHAP-Ident */
		{
			/*
				The CHAP-Ident AVP (AVP Code 404) is of type OctetString and contains
				the 1 octet CHAP Identifier used in the computation of the CHAP
				response [PPPCHAP].
			*/
			struct dict_avp_data adata = { 
					404, 					/* Code */
					0, 					/* Vendor */
					"CHAP-Ident", 				/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,			/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &adata , NULL, NULL);
		}
			
		/* CHAP-Response */
		{
			/*
				The CHAP-Response AVP (AVP Code 405) is of type OctetString and
				contains the 16 octet authentication data provided by the user in
				response to the CHAP challenge [PPPCHAP].
			*/
			struct dict_avp_data adata = { 
					405, 					/* Code */
					0, 					/* Vendor */
					"CHAP-Response", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,			/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &adata , NULL, NULL);
		}
			
		/* CHAP-Auth */
		{
			/*
				The CHAP-Auth AVP (AVP Code 402) is of type Grouped and contains the
				information necessary to authenticate a user using the PPP
				Challenge-Handshake Authentication Protocol (CHAP) [PPPCHAP].  If the
				CHAP-Auth AVP is found in a message, the CHAP-Challenge AVP MUST be
				present as well.  The optional AVPs containing the CHAP response
				depend upon the value of the CHAP-Algorithm AVP.  The grouped AVP has
				the following ABNF grammar:

				CHAP-Auth  ::= < AVP Header: 402 >
        				     { CHAP-Algorithm }
        				     { CHAP-Ident }
        				     [ CHAP-Response ]
        				   * [ AVP ]
			*/
			struct dict_object * avp;
			struct dict_avp_data data = { 
					402, 					/* Code */
					0, 					/* Vendor */
					"CHAP-Auth", 				/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,			/* Fixed flag values */
					AVP_TYPE_GROUPED 			/* base type of data */
					};
			struct local_rules_definition rules[] = 
						{ 	 {  "CHAP-Algorithm", 			RULE_REQUIRED, -1, 1 }
							,{  "CHAP-Ident",			RULE_REQUIRED, -1, 1 }
							,{  "CHAP-Response",			RULE_OPTIONAL, -1, 1 }
						};
			
			CHECK_dict_new( DICT_AVP, &data , NULL, &avp);
			PARSE_loc_rules( rules, avp );
		}
		
		/* CHAP-Challenge */
		{
			/*
				The CHAP-Challenge AVP (AVP Code 60) is of type OctetString and
				contains the CHAP Challenge sent by the NAS to the CHAP peer
				[PPPCHAP].
			*/
			struct dict_avp_data data = { 
					60, 					/* Code */
					0, 					/* Vendor */
					"CHAP-Challenge", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* ARAP-Password */
		{
			/*
				The ARAP-Password AVP (AVP Code 70) is of type OctetString and is
				only present when the Framed-Protocol AVP (see section 6.10.1) is
				included in the message and is set to ARAP.  This AVP MUST NOT be
				present if either the User-Password or the CHAP-Auth AVP is present.
				See [RADIUSExt] for more information on the contents of this AVP.
			*/
			struct dict_avp_data data = { 
					70, 					/* Code */
					0, 					/* Vendor */
					"ARAP-Password", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* ARAP-Challenge-Response */
		{
			/*
				The ARAP-Challenge-Response AVP (AVP Code 84) is of type OctetString
				and is only present when the Framed-Protocol AVP (see section 6.10.1)
				is included in the message and is set to ARAP.  This AVP contains an
				8 octet response to the dial-in client's challenge.  The RADIUS
				server calculates this value by taking the dial-in client's challenge
				from the high-order 8 octets of the ARAP-Password AVP and performing
				DES encryption on this value with the authenticating user's password
				as the key.  If the user's password is fewer than 8 octets in length,
				the password is padded at the end with NULL octets to a length of 8
				before it is used as a key.
			*/
			struct dict_avp_data data = { 
					84, 					/* Code */
					0, 					/* Vendor */
					"ARAP-Challenge-Response", 		/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* ARAP-Security */
		{
			/*
				The ARAP-Security AVP (AVP Code 73) is of type Unsigned32 and MAY be
				present in the AA-Answer message if the Framed-Protocol AVP (see
				section 6.10.1) is set to the value of ARAP, and the Result-Code AVP
				is set to DIAMETER_MULTI_ROUND_AUTH.  See [RADIUSExt] for more
				information on the format of this AVP.
			*/
			struct dict_avp_data data = { 
					73, 					/* Code */
					0, 					/* Vendor */
					"ARAP-Security", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* ARAP-Security-Data */
		{
			/*
				The ARAP-Security-Data AVP (AVP Code 74) is of type OctetString and MAY be
				present in the AA-Request or AA-Answer message if the Framed-Protocol
				AVP is set to the value of ARAP, and the Result-Code AVP is set to
				DIAMETER_MULTI_ROUND_AUTH.  This AVP contains the security module
				challenge or response associated with the ARAP Security Module
				specified in ARAP-Security.
			*/
			struct dict_avp_data data = { 
					74, 					/* Code */
					0, 					/* Vendor */
					"ARAP-Security-Data", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
/********************************
 *  NAS Authorization AVPs      *
 ********************************/		
		/* Service-Type */
		{
			/*
				The Service-Type AVP (AVP Code 6) is of type Enumerated and contains
				the type of service the user has requested or the type of service to
				be provided.  One such AVP MAY be present in an authentication and/or
				authorization request or response.  A NAS is not required to
				implement all of these service types.  It MUST treat unknown or
				unsupported Service-Types received in a response as a failure and end
				the session with a DIAMETER_INVALID_AVP_VALUE Result-Code.

				When used in a request, the Service-Type AVP SHOULD be considered a
				hint to the server that the NAS believes the user would prefer the
				kind of service indicated.  The server is not required to honor the
				hint.  Furthermore, if the service specified by the server is
				supported, but not compatible with the current mode of access, the
				NAS MUST fail to start the session.  The NAS MUST also generate the
				appropriate error message(s).

				The following values have been defined for the Service-Type AVP.  The
				complete list of defined values can be found in [RADIUS] and
				[RADIUSTypes].

				Registry Name: Radius Attribute Values
				Reference: [RFC2865][RFC3575]

				Sub-registry: Values for RADIUS Attribute 6, Service-Type
				Reference: [RFC2865][RFC3575]

				1  Login
				2  Framed
				3  Callback Login
				4  Callback Framed
				5  Outbound
				6  Administrative
				7  NAS Prompt
				8  Authenticate Only
				9  Callback NAS Prompt
				10  Call Check
				11  Callback Administrative
				12  Voice           [Chiba]
				13  Fax             [Chiba]
				14  Modem Relay	    [Chiba]
				15  IAPP-Register   [IEEE 802.11f][Kerry]
				16  IAPP-AP-Check   [IEEE 802.11f][Kerry]
				17  Authorize Only  [RFC3576]

				The following values are further qualified:

				Login               1
				 The user should be connected to a host.  The message MAY
				 include additional AVPs defined in sections 6.16 or 6.17.

				Framed              2
				 A Framed Protocol, such as PPP or SLIP, should be started for
				 the User.  The message MAY include additional AVPs defined in
				 section 6.10, or section 7 for tunneling services.

				Callback Login      3
				 The user should be disconnected and called back, then connected
				 to a host.  The message MAY include additional AVPs defined in
				 this section.

				Callback Framed     4
				 The user should be disconnected and called back, and then a
				 Framed Protocol, such as PPP or SLIP, should be started for the
				 User.  The message MAY include additional AVPs defined in
				 section 6.10, or in section 7 for tunneling services.

			*/
			struct dict_object 	*type;
			struct dict_type_data 	 tdata = { AVP_TYPE_UNSIGNED32,	"Enumerated(Service-Type)"	, NULL, NULL};
			struct dict_enumval_data tvals[] = {
				enumval_def_u32( 1, "Login"),
				enumval_def_u32( 2, "Framed"),
				enumval_def_u32( 3, "Callback Login"),
				enumval_def_u32( 4, "Callback Framed"),
				enumval_def_u32( 5, "Outbound"),
				enumval_def_u32( 6, "Administrative"),
				enumval_def_u32( 7, "NAS Prompt"),
				enumval_def_u32( 8, "Authenticate Only"),
				enumval_def_u32( 9, "Callback NAS Prompt"),
				enumval_def_u32(10, "Call Check"),
				enumval_def_u32(11, "Callback Administrative"),
				enumval_def_u32(12, "Voice [Chiba]"),
				enumval_def_u32(13, "Fax [Chiba]"),
				enumval_def_u32(14, "Modem Relay [Chiba]"),
				enumval_def_u32(15, "IAPP-Register [IEEE 802.11f][Kerry]"),
				enumval_def_u32(16, "IAPP-AP-Check [IEEE 802.11f][Kerry]"),
				enumval_def_u32(17, "Authorize Only [RFC3576]")
			};
			struct dict_avp_data data = { 
					6, 					/* Code */
					0, 					/* Vendor */
					"Service-Type", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			int i;
			/* Create the Enumerated type, enumerated values, and the AVP */
			CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type);
			for (i = 0; i < sizeof(tvals) / sizeof(tvals[0]); i++) {
				CHECK_dict_new( DICT_ENUMVAL, &tvals[i], type, NULL);
			}
			CHECK_dict_new( DICT_AVP, &data , type, NULL);
		}
		
		/* Callback-Number */
		{
			/*
				The Callback-Number AVP (AVP Code 19) is of type UTF8String and
				contains a dialing string to be used for callback.  It MAY be used in
				an authentication and/or authorization request as a hint to the
				server that a Callback service is desired, but the server is not
				required to honor the hint in the corresponding response.
			*/
			struct dict_avp_data data = { 
					19, 					/* Code */
					0, 					/* Vendor */
					"Callback-Number", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL);
		}
		
		/* Callback-Id */
		{
			/*
				The Callback-Id AVP (AVP Code 20) is of type UTF8String and contains
				the name of a place to be called, to be interpreted by the NAS.  This
				AVP MAY be present in an authentication and/or authorization
				response.

				This AVP is not roaming-friendly as it assumes that the Callback-Id
				is configured on the NAS.  Using the Callback-Number AVP therefore
				preferable.
			*/
			struct dict_avp_data data = { 
					20, 					/* Code */
					0, 					/* Vendor */
					"Callback-Id", 				/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL);
		}
		
		/* Idle-Timeout */
		{
			/*
				The Idle-Timeout AVP (AVP Code 28) is of type Unsigned32 and sets the
				maximum number of consecutive seconds of idle connection allowable to
				the user before termination of the session or before a prompt is
				issued.  The default is none, or system specific.
			*/
			struct dict_avp_data data = { 
					28, 					/* Code */
					0, 					/* Vendor */
					"Idle-Timeout", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Port-Limit */
		{
			/*
				The Port-Limit AVP (AVP Code 62) is of type Unsigned32 and sets the
				maximum number of ports the NAS provides to the user.  It MAY be used
				in an authentication and/or authorization request as a hint to the
				server that multilink PPP [PPPMP] service is desired, but the server
				is not required to honor the hint in the corresponding response.
			*/
			struct dict_avp_data data = { 
					62, 					/* Code */
					0, 					/* Vendor */
					"Port-Limit", 				/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* NAS-Filter-Rule */
		{
			/*
				The NAS-Filter-Rule AVP (AVP Code 400) is of type IPFilterRule and
				provides filter rules that need to be configured on the NAS for the
				user.  One or more of these AVPs MAY be present in an authorization
				response.
			*/
			struct dict_avp_data data = { 
					400, 					/* Code */
					0, 					/* Vendor */
					"NAS-Filter-Rule", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , IPFilterRule_type, NULL);
		}
		
		/* Filter-Id */
		{
			/*
				The Filter-Id AVP (AVP Code 11) is of type UTF8String and contains
				the name of the filter list for this user.  Zero or more Filter-Id
				AVPs MAY be sent in an authorization answer.

				Identifying a filter list by name allows the filter to be used on
				different NASes without regard to filter-list implementation details.
				However, this AVP is not roaming friendly, as filter naming differs
				from one service provider to another.

				In non-RADIUS environments, it is RECOMMENDED that the NAS-Filter-
				Rule AVP be used instead.
			*/
			struct dict_avp_data data = { 
					11, 					/* Code */
					0, 					/* Vendor */
					"Filter-Id", 				/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL);
		}
		
		/* Configuration-Token */
		{
			/*
				The Configuration-Token AVP (AVP Code 78) is of type OctetString and
				is sent by a Diameter Server to a Diameter Proxy Agent or Translation
				Agent in an AA-Answer command to indicate a type of user profile to
				be used.  It should not be sent to a Diameter Client (NAS).

				The format of the Data field of this AVP is site specific.
			*/
			struct dict_avp_data data = { 
					78, 					/* Code */
					0, 					/* Vendor */
					"Configuration-Token", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* QoS-Filter-Rule */
		{
			/*
				The QoS-Filter-Rule AVP (AVP Code 407) is of type QoSFilterRule and
				provides QoS filter rules that need to be configured on the NAS for
				the user.  One or more such AVPs MAY be present in an authorization
				response.
			*/
			struct dict_avp_data data = { 
					407, 					/* Code */
					0, 					/* Vendor */
					"QoS-Filter-Rule", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , QoSFilterRule_type, NULL);
		}
		
/***  Framed Access Authorization AVPs  ***/
		
		/* Framed-Protocol */
		{
			/*
				The Framed-Protocol AVP (AVP Code 7) is of type Enumerated and
				contains the framing to be used for framed access.  This AVP MAY be
				present in both requests and responses.  The supported values are
				listed in [RADIUSTypes].

				Sub-registry: Values for RADIUS Attribute 7, Framed-Protocol
				Reference: [RFC2865]
			*/
			struct dict_object 	*type;
			struct dict_type_data 	 tdata = { AVP_TYPE_UNSIGNED32,	"Enumerated(Framed-Protocol)"	, NULL, NULL};
			struct dict_enumval_data tvals[] = {
				enumval_def_u32( 1, "PPP"),
				enumval_def_u32( 2, "SLIP"),
				enumval_def_u32( 3, "AppleTalk Remote Access Protocol (ARAP)"),
				enumval_def_u32( 4, "Gandalf proprietary SingleLink/MultiLink protocol"),
				enumval_def_u32( 5, "Xylogics proprietary IPX/SLIP"),
				enumval_def_u32( 6, "X.75 Synchronous"),
				enumval_def_u32( 7, "GPRS PDP Context [Moore]")
			};
			struct dict_avp_data data = { 
					7, 					/* Code */
					0, 					/* Vendor */
					"Framed-Protocol", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			int i;
			/* Create the Enumerated type, enumerated values, and the AVP */
			CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type);
			for (i = 0; i < sizeof(tvals) / sizeof(tvals[0]); i++) {
				CHECK_dict_new( DICT_ENUMVAL, &tvals[i], type, NULL);
			}
			CHECK_dict_new( DICT_AVP, &data , type, NULL);
		}
		
		/* Framed-Routing */
		{
			/*
				The Framed-Routing AVP (AVP Code 10) is of type Enumerated and
				contains the routing method for the user when the user is a router to
				a network.  This AVP SHOULD only be present in authorization
				responses.  The supported values are listed in [RADIUSTypes].

				Sub-registry: Values for RADIUS Attribute 10, Framed-Routing
				Reference: [RFC2865]
			*/
			struct dict_object 	*type;
			struct dict_type_data 	 tdata = { AVP_TYPE_UNSIGNED32,	"Enumerated(Framed-Routing)"	, NULL, NULL};
			struct dict_enumval_data tvals[] = {
				enumval_def_u32( 0, "None"),
				enumval_def_u32( 1, "Send routing packets"),
				enumval_def_u32( 2, "Listen for routing packets"),
				enumval_def_u32( 3, "Send and Listen")
			};
			struct dict_avp_data data = { 
					10, 					/* Code */
					0, 					/* Vendor */
					"Framed-Routing", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			int i;
			/* Create the Enumerated type, enumerated values, and the AVP */
			CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type);
			for (i = 0; i < sizeof(tvals) / sizeof(tvals[0]); i++) {
				CHECK_dict_new( DICT_ENUMVAL, &tvals[i], type, NULL);
			}
			CHECK_dict_new( DICT_AVP, &data , type, NULL);
		}
		
		/* Framed-MTU */
		{
			/*
				The Framed-MTU AVP (AVP Code 12) is of type Unsigned32 and contains
				the Maximum Transmission Unit to be configured for the user, when it
				is not negotiated by some other means (such as PPP).  This AVP SHOULD
				only be present in authorization responses.  The MTU value MUST be in
				the range from 64 to 65535.
			*/
			struct dict_avp_data data = { 
					12, 					/* Code */
					0, 					/* Vendor */
					"Framed-MTU", 				/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Framed-Compression */
		{
			/*
				The Framed-Compression AVP (AVP Code 13) is of type Enumerated and
				contains the compression protocol to be used for the link.  It MAY be
				used in an authorization request as a hint to the server that a
				specific compression type is desired, but the server is not required
				to honor the hint in the corresponding response.

				More than one compression protocol AVP MAY be sent.  The NAS is
				responsible for applying the proper compression protocol to the
				appropriate link traffic.

				The supported values are listed in [RADIUSTypes].
				Sub-registry: Values for RADIUS Attribute 13, Framed-Compression
				Reference: [RFC2865]
			*/
			struct dict_object 	*type;
			struct dict_type_data 	 tdata = { AVP_TYPE_UNSIGNED32,	"Enumerated(Framed-Compression)"	, NULL, NULL};
			struct dict_enumval_data tvals[] = {
				enumval_def_u32( 0, "None"),
				enumval_def_u32( 1, "VJ TCP/IP header compression"),
				enumval_def_u32( 2, "IPX header compression"),
				enumval_def_u32( 3, "Stac-LZS compression")
			};
			struct dict_avp_data data = { 
					13, 					/* Code */
					0, 					/* Vendor */
					"Framed-Compression", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			int i;
			/* Create the Enumerated type, enumerated values, and the AVP */
			CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type);
			for (i = 0; i < sizeof(tvals) / sizeof(tvals[0]); i++) {
				CHECK_dict_new( DICT_ENUMVAL, &tvals[i], type, NULL);
			}
			CHECK_dict_new( DICT_AVP, &data , type, NULL);
		}
		
/***  IP Access Authorization AVPs  ***/
		
		/* Framed-IP-Address */
		{
			/*
				The Framed-IP-Address AVP (AVP Code 8) [RADIUS] is of type
				OctetString and contains an IPv4 address of the type specified in the
				attribute value to be configured for the user.  It MAY be used in an
				authorization request as a hint to the server that a specific address
				is desired, but the server is not required to honor the hint in the
				corresponding response.

				Two values have special significance: 0xFFFFFFFF and 0xFFFFFFFE.  The
				value 0xFFFFFFFF indicates that the NAS should allow the user to
				select an address (i.e., negotiated).  The value 0xFFFFFFFE indicates
				that the NAS should select an address for the user (e.g., assigned
				from a pool of addresses kept by the NAS).
			*/
			struct dict_avp_data data = { 
					8, 					/* Code */
					0, 					/* Vendor */
					"Framed-IP-Address", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Framed-IP-Netmask */
		{
			/*
				The Framed-IP-Netmask AVP (AVP Code 9) is of type OctetString and
				contains the four octets of the IPv4 netmask to be configured for the
				user when the user is a router to a network.  It MAY be used in an
				authorization request as a hint to the server that a specific netmask
				is desired, but the server is not required to honor the hint in the
				corresponding response.  This AVP MUST be present in a response if
				the request included this AVP with a value of 0xFFFFFFFF.
			*/
			struct dict_avp_data data = { 
					9, 					/* Code */
					0, 					/* Vendor */
					"Framed-IP-Netmask", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Framed-Route */
		{
			/*
				The Framed-Route AVP (AVP Code 22) is of type UTF8String and contains
				the ASCII routing information to be configured for the user on the
				NAS.  Zero or more of these AVPs MAY be present in an authorization
				response.

				The string MUST contain a destination prefix in dotted quad form
				optionally followed by a slash and a decimal length specifier stating
				how many high-order bits of the prefix should be used.  This is
				followed by a space, a gateway address in dotted quad form, a space,
				and one or more metrics separated by spaces; for example,

				"192.168.1.0/24 192.168.1.1 1".

				The length specifier may be omitted, in which case it should default
				to 8 bits for class A prefixes, to 16 bits for class B prefixes, and
				to 24 bits for class C prefixes; for example,

				"192.168.1.0 192.168.1.1 1".

				Whenever the gateway address is specified as "0.0.0.0" the IP address
				of the user SHOULD be used as the gateway address.
			*/
			struct dict_avp_data data = { 
					22, 					/* Code */
					0, 					/* Vendor */
					"Framed-Route", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL);
		}
		
		/* Framed-Pool */
		{
			/*
				The Framed-Pool AVP (AVP Code 88) is of type OctetString and contains
				the name of an assigned address pool that SHOULD be used to assign an
				address for the user.  If a NAS does not support multiple address
				pools, the NAS SHOULD ignore this AVP.  Address pools are usually
				used for IP addresses but can be used for other protocols if the NAS
				supports pools for those protocols.

				Although specified as type OctetString for compatibility with RADIUS
				[RADIUSExt], the encoding of the Data field SHOULD also conform to
				the rules for the UTF8String Data Format.
			*/
			struct dict_avp_data data = { 
					88, 					/* Code */
					0, 					/* Vendor */
					"Framed-Pool", 				/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Framed-Interface-Id */
		{
			/*
				The Framed-Interface-Id AVP (AVP Code 96) is of type Unsigned64 and
				contains the IPv6 interface identifier to be configured for the user.
				It MAY be used in authorization requests as a hint to the server that
				a specific interface id is desired, but the server is not required to
				honor the hint in the corresponding response.
			*/
			struct dict_avp_data data = { 
					96, 					/* Code */
					0, 					/* Vendor */
					"Framed-Interface-Id", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED64 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Framed-IPv6-Prefix */
		{
			/*
				The Framed-IPv6-Prefix AVP (AVP Code 97) is of type OctetString and
				contains the IPv6 prefix to be configured for the user.  One or more
				AVPs MAY be used in authorization requests as a hint to the server
				that specific IPv6 prefixes are desired, but the server is not
				required to honor the hint in the corresponding response.
			*/
			struct dict_avp_data data = { 
					97, 					/* Code */
					0, 					/* Vendor */
					"Framed-IPv6-Prefix", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Framed-IPv6-Route */
		{
			/*
				The Framed-IPv6-Route AVP (AVP Code 99) is of type UTF8String and
				contains the ASCII routing information to be configured for the user
				on the NAS.  Zero or more of these AVPs MAY be present in an
				authorization response.

				The string MUST contain an IPv6 address prefix followed by a slash
				and a decimal length specifier stating how many high order bits of
				the prefix should be used.  This is followed by a space, a gateway
				address in hexadecimal notation, a space, and one or more metrics
				separated by spaces; for example,

				"2000:0:0:106::/64 2000::106:a00:20ff:fe99:a998 1".

				Whenever the gateway address is the IPv6 unspecified address, the IP
				address of the user SHOULD be used as the gateway address, such as
				in:

				"2000:0:0:106::/64 :: 1".
			*/
			struct dict_avp_data data = { 
					99, 					/* Code */
					0, 					/* Vendor */
					"Framed-IPv6-Route", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL);
		}
		
		/* Framed-IPv6-Pool */
		{
			/*
				The Framed-IPv6-Pool AVP (AVP Code 100) is of type OctetString and
				contains the name of an assigned pool that SHOULD be used to assign
				an IPv6 prefix for the user.  If the access device does not support
				multiple prefix pools, it MUST ignore this AVP.

				Although specified as type OctetString for compatibility with RADIUS
				[RADIUSIPv6], the encoding of the Data field SHOULD also conform to
				the rules for the UTF8String Data Format.
			*/
			struct dict_avp_data data = { 
					100, 					/* Code */
					0, 					/* Vendor */
					"Framed-IPv6-Pool", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
/***  IPX Access  ***/
		
		/* Framed-IPX-Network */
		{
			/*
				The Framed-IPX-Network AVP (AVP Code 23) is of type Unsigned32 and
				contains the IPX Network number to be configured for the user.  It
				MAY be used in an authorization request as a hint to the server that
				a specific address is desired, but the server is not required to
				honor the hint in the corresponding response.

				Two addresses have special significance: 0xFFFFFFFF and 0xFFFFFFFE.
				The value 0xFFFFFFFF indicates that the NAS should allow the user to
				select an address (i.e., Negotiated).  The value 0xFFFFFFFE indicates
				that the NAS should select an address for the user (e.g., assign it
				from a pool of one or more IPX networks kept by the NAS).
			*/
			struct dict_avp_data data = { 
					23, 					/* Code */
					0, 					/* Vendor */
					"Framed-IPX-Network", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
/***  AppleTalk Network Access  ***/
		
		/* Framed-AppleTalk-Link */
		{
			/*
				The Framed-AppleTalk-Link AVP (AVP Code 37) is of type Unsigned32 and
				contains the AppleTalk network number that should be used for the
				serial link to the user, which is another AppleTalk router.  This AVP
				MUST only be present in an authorization response and is never used
				when the user is not another router.

				Despite the size of the field, values range from 0 to 65,535.  The
				special value of 0 indicates an unnumbered serial link.  A value of 1
				to 65,535 means that the serial line between the NAS and the user
				should be assigned that value as an AppleTalk network number.
			*/
			struct dict_avp_data data = { 
					37, 					/* Code */
					0, 					/* Vendor */
					"Framed-AppleTalk-Link", 		/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Framed-AppleTalk-Network */
		{
			/*
				The Framed-AppleTalk-Network AVP (AVP Code 38) is of type Unsigned32
				and contains the AppleTalk Network number that the NAS should probe
				to allocate an AppleTalk node for the user.  This AVP MUST only be
				present in an authorization response and is never used when the user
				is not another router.  Multiple instances of this AVP indicate that
				the NAS may probe, using any of the network numbers specified.

				Despite the size of the field, values range from 0 to 65,535.  The
				special value 0 indicates that the NAS should assign a network for
				the user, using its default cable range.  A value between 1 and
				65,535 (inclusive) indicates to the AppleTalk Network that the NAS
				should probe to find an address for the user.
			*/
			struct dict_avp_data data = { 
					38, 					/* Code */
					0, 					/* Vendor */
					"Framed-AppleTalk-Network", 		/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Framed-AppleTalk-Zone */
		{
			/*
				The Framed-AppleTalk-Zone AVP (AVP Code 39) is of type OctetString
				and contains the AppleTalk Default Zone to be used for this user.
				This AVP MUST only be present in an authorization response.  Multiple
				instances of this AVP in the same message are not allowed.

				The codification of this field's allowed range is outside the scope
				of this specification.
			*/
			struct dict_avp_data data = { 
					39, 					/* Code */
					0, 					/* Vendor */
					"Framed-AppleTalk-Zone", 		/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
/***  AppleTalk Remote Access [RFC2869] ***/
		
		/* ARAP-Features */
		{
			/*
				The ARAP-Features AVP (AVP Code 71) is of type OctetString and MAY be
				present in the AA-Accept message if the Framed-Protocol AVP is set to
				the value of ARAP.  See [RADIUSExt] for more information about the
				format of this AVP.
			*/
			struct dict_avp_data data = { 
					71, 					/* Code */
					0, 					/* Vendor */
					"ARAP-Features", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* ARAP-Zone-Access */
		{
			/*
				The ARAP-Zone-Access AVP (AVP Code 72) is of type Enumerated and MAY
				be present in the AA-Accept message if the Framed-Protocol AVP is set
				to the value of ARAP.

				The supported values are listed in [RADIUSTypes] and defined in
				[RADIUSExt].
				Sub-registry: Values for RADIUS Attribute 72, ARAP-Zone-Access 
				Reference: [RFC2869]
			*/
			struct dict_object 	*type;
			struct dict_type_data 	 tdata = { AVP_TYPE_UNSIGNED32,	"Enumerated(ARAP-Zone-Access)"	, NULL, NULL};
			struct dict_enumval_data tvals[] = {
				enumval_def_u32( 1, "Only allow access to default zone [RFC2869]"),
				enumval_def_u32( 2, "Use zone filter inclusively [RFC2869]"),
				enumval_def_u32( 3, "Not used [RFC2869]"),
				enumval_def_u32( 4, "Use zone filter exclusively [RFC2869]")
			};
			struct dict_avp_data data = { 
					72, 					/* Code */
					0, 					/* Vendor */
					"ARAP-Zone-Access", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			int i;
			/* Create the Enumerated type, enumerated values, and the AVP */
			CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type);
			for (i = 0; i < sizeof(tvals) / sizeof(tvals[0]); i++) {
				CHECK_dict_new( DICT_ENUMVAL, &tvals[i], type, NULL);
			}
			CHECK_dict_new( DICT_AVP, &data , type, NULL);
		}
		
/***  Non-Framed Access Authorization AVPs ***/
		
		/* Login-IP-Host */
		{
			/*
				The Login-IP-Host AVP (AVP Code 14) [RADIUS] is of type OctetString
				and contains the IPv4 address of a host with which to connect the
				user when the Login-Service AVP is included.  It MAY be used in an
				AA-Request command as a hint to the Diameter Server that a specific
				host is desired, but the Diameter Server is not required to honor the
				hint in the AA-Answer.

				Two addresses have special significance: all ones and 0.  The value
				of all ones indicates that the NAS SHOULD allow the user to select an
				address.  The value 0 indicates that the NAS SHOULD select a host to
				connect the user to.
			*/
			struct dict_object 	*type;
			uint32_t		 allzeros = 0;
			uint32_t		 allones  = (uint32_t) -1;
			struct dict_type_data 	 tdata = { AVP_TYPE_OCTETSTRING,	"Enumerated(Login-IP-Host)"	, NULL, NULL};
			struct dict_enumval_data tvals[] = {
				enumval_def_os( 4, &allzeros, "(0) NAS selects the host"),
				enumval_def_os( 4, &allones , "(1) User selects the address")
			};
			struct dict_avp_data data = { 
					14, 					/* Code */
					0, 					/* Vendor */
					"Login-IP-Host", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			int i;
			/* Create the Enumerated type, enumerated values, and the AVP */
			CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type);
			for (i = 0; i < sizeof(tvals) / sizeof(tvals[0]); i++) {
				CHECK_dict_new( DICT_ENUMVAL, &tvals[i], type, NULL);
			}
			CHECK_dict_new( DICT_AVP, &data , type, NULL);
		}
		
		/* Login-IPv6-Host */
		{
			/*
				The Login-IPv6-Host AVP (AVP Code 98) [RADIUSIPv6] is of type
				OctetString and contains the IPv6 address of a host with which to
				connect the user when the Login-Service AVP is included.  It MAY be
				used in an AA-Request command as a hint to the Diameter Server that a
				specific host is desired, but the Diameter Server is not required to
				honor the hint in the AA-Answer.

				Two addresses have special significance:

				0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF and 0.  The value
				0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF indicates that the NAS SHOULD
				allow the user to select an address.  The value 0 indicates that the
				NAS SHOULD select a host to connect the user to.

			*/
			struct dict_object 	*type;
			unsigned char 		 allzeros[16];
			unsigned char		 allones[16];
			struct dict_type_data 	 tdata = { AVP_TYPE_OCTETSTRING,	"Enumerated(Login-IPv6-Host)"	, NULL, NULL};
			struct dict_enumval_data tvals[] = {
				enumval_def_os( 16, &allzeros, "(0) NAS selects the host"),
				enumval_def_os( 16, &allones , "(1) User selects the address")
			};
			struct dict_avp_data data = { 
					98, 					/* Code */
					0, 					/* Vendor */
					"Login-IPv6-Host", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			int i;
			memset(allzeros, 0,   sizeof(allzeros));
			memset(allones, 0xff, sizeof(allones));
			/* Create the Enumerated type, enumerated values, and the AVP */
			CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type);
			for (i = 0; i < sizeof(tvals) / sizeof(tvals[0]); i++) {
				CHECK_dict_new( DICT_ENUMVAL, &tvals[i], type, NULL);
			}
			CHECK_dict_new( DICT_AVP, &data , type, NULL);
		}
		
		/* Login-Service */
		{
			/*
				The Login-Service AVP (AVP Code 15) is of type Enumerated and
				contains the service that should be used to connect the user to the
				login host.  This AVP SHOULD only be present in authorization
				responses.

				The supported values are listed in [RADIUSTypes].
				Sub-registry: Values for RADIUS Attribute 15, Login-Service
				Reference: [RFC2865]
   			*/
			struct dict_object 	*type;
			struct dict_type_data 	 tdata = { AVP_TYPE_UNSIGNED32,	"Enumerated(Login-Service)"	, NULL, NULL};
			struct dict_enumval_data tvals[] = {
				enumval_def_u32( 0, "Telnet"),
				enumval_def_u32( 1, "Rlogin"),
				enumval_def_u32( 2, "TCP Clear"),
				enumval_def_u32( 3, "PortMaster (proprietary)"),
				enumval_def_u32( 4, "LAT"),
				enumval_def_u32( 5, "X25-PAD"),
				enumval_def_u32( 6, "X25-T3POS"),
				enumval_def_u32( 8, "TCP Clear Quiet (suppresses any NAS-generated connect string)")
			};
			struct dict_avp_data data = { 
					15, 					/* Code */
					0, 					/* Vendor */
					"Login-Service", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			int i;
			/* Create the Enumerated type, enumerated values, and the AVP */
			CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type);
			for (i = 0; i < sizeof(tvals) / sizeof(tvals[0]); i++) {
				CHECK_dict_new( DICT_ENUMVAL, &tvals[i], type, NULL);
			}
			CHECK_dict_new( DICT_AVP, &data , type, NULL);
		}
		
/***  TCP Services  ***/
		
		/* Login-TCP-Port */
		{
			/*
				The Login-TCP-Port AVP (AVP Code 16) is of type Unsigned32 and
				contains the TCP port with which the user is to be connected when the
				Login-Service AVP is also present.  This AVP SHOULD only be present
				in authorization responses.  The value MUST NOT be greater than
				65,535.
			*/
			struct dict_avp_data data = { 
					16, 					/* Code */
					0, 					/* Vendor */
					"Login-TCP-Port", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
/***  LAT Services  ***/
		
		/* Login-LAT-Service */
		{
			/*
				The Login-LAT-Service AVP (AVP Code 34) is of type OctetString and
				contains the system with which the user is to be connected by LAT.
				It MAY be used in an authorization request as a hint to the server
				that a specific service is desired, but the server is not required to
				honor the hint in the corresponding response.  This AVP MUST only be
				present in the response if the Login-Service AVP states that LAT is
				desired.

				Administrators use this service attribute when dealing with clustered
				systems, such as a VAX or Alpha cluster.  In these environments,
				several different time-sharing hosts share the same resources (disks,
				printers, etc.), and administrators often configure each host to
				offer access (service) to each of the shared resources.  In this
				case, each host in the cluster advertises its services through LAT
				broadcasts.

				Sophisticated users often know which service providers (machines) are
				faster and tend to use a node name when initiating a LAT connection.
				Some administrators want particular users to use certain machines as
				a primitive form of load balancing (although LAT knows how to do load
				balancing itself).

				The String field contains the identity of the LAT service to use.
				The LAT Architecture allows this string to contain $ (dollar), -
				(hyphen), . (period), _ (underscore), numerics, upper- and lowercase
				alphabetics, and the ISO Latin-1 character set extension [ISOLatin].
				All LAT string comparisons are case insensitive.
			*/
			struct dict_avp_data data = { 
					34, 					/* Code */
					0, 					/* Vendor */
					"Login-LAT-Service", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Login-LAT-Node */
		{
			/*
				The Login-LAT-Node AVP (AVP Code 35) is of type OctetString and
				contains the Node with which the user is to be automatically
				connected by LAT.  It MAY be used in an authorization request as a
				hint to the server that a specific LAT node is desired, but the
				server is not required to honor the hint in the corresponding
				response.  This AVP MUST only be present in a response if the Login-
				Service-Type AVP is set to LAT.

				The String field contains the identity of the LAT service to use.
				The LAT Architecture allows this string to contain $ (dollar), -
				(hyphen), . (period), _ (underscore), numerics, upper- and lowercase
				alphabetics, and the ISO Latin-1 character set extension [ISOLatin].
				All LAT string comparisons are case insensitive.
			*/
			struct dict_avp_data data = { 
					35, 					/* Code */
					0, 					/* Vendor */
					"Login-LAT-Node", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Login-LAT-Group */
		{
			/*
				The Login-LAT-Group AVP (AVP Code 36) is of type OctetString and
				contains a string identifying the LAT group codes this user is
				authorized to use.  It MAY be used in an authorization request as a
				hint to the server that a specific group is desired, but the server
				is not required to honor the hint in the corresponding response.
				This AVP MUST only be present in a response if the Login-Service-Type
				AVP is set to LAT.

				LAT supports 256 different group codes, which LAT uses as a form of
				access rights.  LAT encodes the group codes as a 256-bit bitmap.

				Administrators can assign one or more of the group code bits at the
				LAT service provider; it will only accept LAT connections that have
				these group codes set in the bitmap.  The administrators assign a
				bitmap of authorized group codes to each user.  LAT gets these from
				the operating system and uses them in its requests to the service
				providers.

				The codification of the range of allowed usage of this field is
				outside the scope of this specification.
			*/
			struct dict_avp_data data = { 
					36, 					/* Code */
					0, 					/* Vendor */
					"Login-LAT-Group", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Login-LAT-Port */
		{
			/*
				The Login-LAT-Port AVP (AVP Code 63) is of type OctetString and
				contains the Port with which the user is to be connected by LAT.  It
				MAY be used in an authorization request as a hint to the server that
				a specific port is desired, but the server is not required to honor
				the hint in the corresponding response.  This AVP MUST only be
				present in a response if the Login-Service-Type AVP is set to LAT.

				The String field contains the identity of the LAT service to use.
				The LAT Architecture allows this string to contain $ (dollar), -
				(hyphen), . (period), _ (underscore), numerics, upper- and lower-case
				alphabetics, and the ISO Latin-1 character set extension [ISOLatin].
				All LAT string comparisons are case insensitive.
			*/
			struct dict_avp_data data = { 
					63, 					/* Code */
					0, 					/* Vendor */
					"Login-LAT-Port", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
/********************************
 *  NAS Tunneling AVPs          *
 ********************************/		
		/* Tunnel-Type */
		{
			/*
				The Tunnel-Type AVP (AVP Code 64) is of type Enumerated and contains
				the tunneling protocol(s) to be used (in the case of a tunnel
				initiator) or in use (in the case of a tunnel terminator).  It MAY be
				used in an authorization request as a hint to the server that a
				specific tunnel type is desired, but the server is not required to
				honor the hint in the corresponding response.

				The Tunnel-Type AVP SHOULD also be included in Accounting-Request
				messages.

				A tunnel initiator is not required to implement any of these tunnel
				types.  If a tunnel initiator receives a response that contains only
				unknown or unsupported Tunnel-Types, the tunnel initiator MUST behave
				as though a response were received with the Result-Code indicating a
				failure.

				The supported values are listed in [RADIUSTypes].
				Sub-registry: Values for RADIUS Attribute 64, Tunnel-Type 
				Reference: [RFC2868]
			*/
			struct dict_object 	*type;
			struct dict_type_data 	 tdata = { AVP_TYPE_UNSIGNED32,	"Enumerated(Tunnel-Type)"	, NULL, NULL};
			struct dict_enumval_data tvals[] = {
				enumval_def_u32( 1, "Point-to-Point Tunneling Protocol (PPTP) [RFC2868]"),
				enumval_def_u32( 2, "Layer Two Forwarding (L2F) [RFC2868]"),
				enumval_def_u32( 3, "Layer Two Tunneling Protocol (L2TP) [RFC2868]"),
				enumval_def_u32( 4, "Ascend Tunnel Management Protocol (ATMP) [RFC2868]"),
				enumval_def_u32( 5, "Virtual Tunneling Protocol (VTP) [RFC2868]"),
				enumval_def_u32( 6, "IP Authentication Header in the Tunnel-mode (AH) [RFC2868]"),
				enumval_def_u32( 7, "IP-in-IP Encapsulation (IP-IP) [RFC2868]"),
				enumval_def_u32( 8, "Minimal IP-in-IP Encapsulation (MIN-IP-IP) [RFC2868]"),
				enumval_def_u32( 9, "IP Encapsulating Security Payload in the Tunnel-mode (ESP) [RFC2868]"),
				enumval_def_u32(10, "Generic Route Encapsulation (GRE) [RFC2868]"),
				enumval_def_u32(11, "Bay Dial Virtual Services (DVS) [RFC2868]"),
				enumval_def_u32(12, "IP-in-IP Tunneling [RFC2868]"),
				enumval_def_u32(13, "Virtual LANs (VLAN) [RFC3580]")
			};
			struct dict_avp_data adata = { 
					64, 					/* Code */
					0, 					/* Vendor */
					"Tunnel-Type", 				/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,			/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			int i;
			CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type);
			for (i = 0; i < sizeof(tvals) / sizeof(tvals[0]); i++) {
				CHECK_dict_new( DICT_ENUMVAL, &tvals[i], type, NULL);
			}
			CHECK_dict_new( DICT_AVP, &adata , type, NULL);
		}
		
		/* Tunnel-Medium-Type */
		{
			/*
				The Tunnel-Medium-Type AVP (AVP Code 65) is of type Enumerated and
				contains the transport medium to use when creating a tunnel for
				protocols (such as L2TP) that can operate over multiple transports.
				It MAY be used in an authorization request as a hint to the server
				that a specific medium is desired, but the server is not required to
				honor the hint in the corresponding response.

				The supported values are listed in [RADIUSTypes].
				Sub-registry: Values for RADIUS Attribute 65, Tunnel-Medium-Type
				Reference: [RFC2868]
			*/
			struct dict_object 	*type;
			struct dict_type_data 	 tdata = { AVP_TYPE_UNSIGNED32,	"Enumerated(Tunnel-Medium-Type)"	, NULL, NULL};
			struct dict_enumval_data tvals[] = {
				enumval_def_u32( 1, "IPv4 (IP version 4) [RFC2868]"),
				enumval_def_u32( 2, "IPv6 (IP version 6) [RFC2868]"),
				enumval_def_u32( 3, "NSAP [RFC2868]"),
				enumval_def_u32( 4, "HDLC (8-bit multidrop) [RFC2868]"),
				enumval_def_u32( 5, "BBN 1822 [RFC2868]"),
				enumval_def_u32( 6, "802 (includes all 802 media plus Ethernet \"canonical format\") [RFC2868]"),
				enumval_def_u32( 7, "E.163 (POTS) [RFC2868]"),
				enumval_def_u32( 8, "E.164 (SMDS, Frame Relay, ATM) [RFC2868]"),
				enumval_def_u32( 9, "F.69 (Telex) [RFC2868]"),
				enumval_def_u32(10, "X.121 (X.25, Frame Relay) [RFC2868]"),
				enumval_def_u32(11, "IPX [RFC2868]"),
				enumval_def_u32(12, "Appletalk [RFC2868]"),
				enumval_def_u32(13, "Decnet IV [RFC2868]"),
				enumval_def_u32(14, "Banyan Vines [RFC2868]"),
				enumval_def_u32(15, "E.164 with NSAP format subaddress [RFC2868]")
			};
			struct dict_avp_data adata = { 
					65, 					/* Code */
					0, 					/* Vendor */
					"Tunnel-Medium-Type", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,			/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			int i;
			CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type);
			for (i = 0; i < sizeof(tvals) / sizeof(tvals[0]); i++) {
				CHECK_dict_new( DICT_ENUMVAL, &tvals[i], type, NULL);
			}
			CHECK_dict_new( DICT_AVP, &adata , type, NULL);
		}
		
		/* Tunnel-Client-Endpoint */
		{
			/*
				The Tunnel-Client-Endpoint AVP (AVP Code 66) is of type UTF8String
				and contains the address of the initiator end of the tunnel.  It MAY
				be used in an authorization request as a hint to the server that a
				specific endpoint is desired, but the server is not required to honor
				the hint in the corresponding response.

				This AVP SHOULD be included in the corresponding Accounting-Request
				messages, in which case it indicates the address from which the
				tunnel was initiated.  This AVP, along with the Tunnel-Server-
				Endpoint and Session-Id AVP [BASE], MAY be used to provide a globally
				unique means to identify a tunnel for accounting and auditing
				purposes.

				If Tunnel-Medium-Type is IPv4 (1), then this string is either the
				fully qualified domain name (FQDN) of the tunnel client machine, or a
				"dotted-decimal" IP address.  Implementations MUST support the
				dotted-decimal format and SHOULD support the FQDN format for IP
				addresses.

				If Tunnel-Medium-Type is IPv6 (2), then this string is either the
				FQDN of the tunnel client machine, or a text representation of the
				address in either the preferred or alternate form [IPv6Addr].
				Conforming implementations MUST support the preferred form and SHOULD
				support both the alternate text form and the FQDN format for IPv6
				addresses.

				If Tunnel-Medium-Type is neither IPv4 nor IPv6, then this string is a
				tag referring to configuration data local to the Diameter client that
				describes the interface or medium-specific client address to use.
   			*/
			struct dict_avp_data adata = { 
					66, 					/* Code */
					0, 					/* Vendor */
					"Tunnel-Client-Endpoint", 		/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,			/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &adata , UTF8String_type, NULL);
		}
		
		/* Tunnel-Server-Endpoint */
		{
			/*
				The Tunnel-Server-Endpoint AVP (AVP Code 67) is of type UTF8String
				and contains the address of the server end of the tunnel.  It MAY be
				used in an authorization request as a hint to the server that a
				specific endpoint is desired, but the server is not required to honor
				the hint in the corresponding response.

				This AVP SHOULD be included in the corresponding Accounting-Request
				messages, in which case it indicates the address from which the
				tunnel was initiated.  This AVP, along with the Tunnel-Client-
				Endpoint and Session-Id AVP [BASE], MAY be used to provide a globally
				unique means to identify a tunnel for accounting and auditing
				purposes.

				If Tunnel-Medium-Type is IPv4 (1), then this string is either the
				fully qualified domain name (FQDN) of the tunnel server machine, or a
				"dotted-decimal" IP address.  Implementations MUST support the
				dotted-decimal format and SHOULD support the FQDN format for IP
				addresses.

				If Tunnel-Medium-Type is IPv6 (2), then this string is either the
				FQDN of the tunnel server machine, or a text representation of the
				address in either the preferred or alternate form [IPv6Addr].
				Implementations MUST support the preferred form and SHOULD support
				both the alternate text form and the FQDN format for IPv6 addresses.

				If Tunnel-Medium-Type is not IPv4 or IPv6, this string is a tag
				referring to configuration data local to the Diameter client that
				describes the interface or medium-specific server address to use.
   			*/
			struct dict_avp_data adata = { 
					67, 					/* Code */
					0, 					/* Vendor */
					"Tunnel-Server-Endpoint", 		/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,			/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &adata , UTF8String_type, NULL);
		}
		
		/* Tunnel-Password */
		{
			/*
				The Tunnel-Password AVP (AVP Code 69) is of type OctetString and may
				contain a password to be used to authenticate to a remote server.
				The Tunnel-Password AVP contains sensitive information.  This value
				is not protected in the same manner as RADIUS [RADTunnels].

				As required in [BASE], Diameter messages are encrypted by using IPsec
				or TLS.  The Tunnel-Password AVP SHOULD NOT be used in untrusted
				proxy environments without encrypting it by using end-to-end security
				techniques, such as CMS Security [DiamCMS].
   			*/
			struct dict_avp_data adata = { 
					69, 					/* Code */
					0, 					/* Vendor */
					"Tunnel-Password", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,			/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &adata , NULL, NULL);
		}
		
		/* Tunnel-Private-Group-Id */
		{
			/*
				The Tunnel-Private-Group-Id AVP (AVP Code 81) is of type OctetString
				and contains the group Id for a particular tunneled session.  The
				Tunnel-Private-Group-Id AVP MAY be included in an authorization
				request if the tunnel initiator can predetermine the group resulting
				from a particular connection.  It SHOULD be included in the
				authorization response if this tunnel session is to be treated as
				belonging to a particular private group.  Private groups may be used
				to associate a tunneled session with a particular group of users.
				For example, it MAY be used to facilitate routing of unregistered IP
				addresses through a particular interface.  This AVP SHOULD be
				included in the Accounting-Request messages that pertain to the
				tunneled session.
   			*/
			struct dict_avp_data adata = { 
					81, 					/* Code */
					0, 					/* Vendor */
					"Tunnel-Private-Group-Id", 		/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,			/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &adata , NULL, NULL);
		}
		
		/* Tunnel-Assignment-Id */
		{
			/*
				The Tunnel-Assignment-Id AVP (AVP Code 82) is of type OctetString and
				is used to indicate to the tunnel initiator the particular tunnel to
				which a session is to be assigned.  Some tunneling protocols, such as
				[PPTP] and [L2TP], allow for sessions between the same two tunnel
				endpoints to be multiplexed over the same tunnel and also for a given
				session to use its own dedicated tunnel.  This attribute provides a
				mechanism for Diameter to inform the tunnel initiator (e.g., PAC,
				LAC) whether to assign the session to a multiplexed tunnel or to a
				separate tunnel.  Furthermore, it allows for sessions sharing
				multiplexed tunnels to be assigned to different multiplexed tunnels.

				A particular tunneling implementation may assign differing
				characteristics to particular tunnels.  For example, different
				tunnels may be assigned different QoS parameters.  Such tunnels may
				be used to carry either individual or multiple sessions.  The
				Tunnel-Assignment-Id attribute thus allows the Diameter server to
				indicate that a particular session is to be assigned to a tunnel
				providing an appropriate level of service.  It is expected that any
				QoS-related Diameter tunneling attributes defined in the future
				accompanying this one will be associated by the tunnel initiator with
				the Id given by this attribute.  In the meantime, any semantic given
				to a particular Id string is a matter left to local configuration in
				the tunnel initiator.

				The Tunnel-Assignment-Id AVP is of significance only to Diameter and
				the tunnel initiator.  The Id it specifies is only intended to be of
				local use to Diameter and the tunnel initiator.  The Id assigned by
				the tunnel initiator is not conveyed to the tunnel peer.

				This attribute MAY be included in authorization responses.  The
				tunnel initiator receiving this attribute MAY choose to ignore it and
				to assign the session to an arbitrary multiplexed or non-multiplexed
				tunnel between the desired endpoints.  This AVP SHOULD also be
				included in the Accounting-Request messages pertaining to the
				tunneled session.

				If a tunnel initiator supports the Tunnel-Assignment-Id AVP, then it
				should assign a session to a tunnel in the following manner:

				-  If this AVP is present and a tunnel exists between the
				 specified endpoints with the specified Id, then the session
				 should be assigned to that tunnel.

				-  If this AVP is present and no tunnel exists between the
				 specified endpoints with the specified Id, then a new tunnel
				 should be established for the session and the specified Id
				 should be associated with the new tunnel.

				-  If this AVP is not present, then the session is assigned to an
				 unnamed tunnel.  If an unnamed tunnel does not yet exist
				 between the specified endpoints, then it is established and
				 used for this session and for subsequent ones established
				 without the Tunnel-Assignment-Id attribute.  A tunnel initiator
				 MUST NOT assign a session for which a Tunnel-Assignment-Id AVP
				 was not specified to a named tunnel (i.e., one that was
				 initiated by a session specifying this AVP).

				Note that the same Id may be used to name different tunnels if these
				tunnels are between different endpoints.

   			*/
			struct dict_avp_data adata = { 
					82, 					/* Code */
					0, 					/* Vendor */
					"Tunnel-Assignment-Id", 		/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,			/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &adata , NULL, NULL);
		}
		
		/* Tunnel-Preference */
		{
			/*
				The Tunnel-Preference AVP (AVP Code 83) is of type Unsigned32 and is
				used to identify the relative preference assigned to each tunnel when
				more than one set of tunneling AVPs is returned within separate
				Grouped-AVP AVPs.  It MAY be used in an authorization request as a
				hint to the server that a specific preference is desired, but the
				server is not required to honor the hint in the corresponding
				response.

				For example, suppose that AVPs describing two tunnels are returned by
				the server, one with a Tunnel-Type of PPTP and the other with a
				Tunnel-Type of L2TP.  If the tunnel initiator supports only one of
				the Tunnel-Types returned, it will initiate a tunnel of that type.
				If, however, it supports both tunnel protocols, it SHOULD use the
				value of the Tunnel-Preference AVP to decide which tunnel should be
				started.  The tunnel with the lowest numerical value in the Value
				field of this AVP SHOULD be given the highest preference.  The values
				assigned to two or more instances of the Tunnel-Preference AVP within
				a given authorization response MAY be identical.  In this case, the
				tunnel initiator SHOULD use locally configured metrics to decide
				which set of AVPs to use.
   			*/
			struct dict_avp_data adata = { 
					83, 					/* Code */
					0, 					/* Vendor */
					"Tunnel-Preference", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,			/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &adata , NULL, NULL);
		}
		
		/* Tunnel-Client-Auth-Id */
		{
			/*
				The Tunnel-Client-Auth-Id AVP (AVP Code 90) is of type UTF8String and
				specifies the name used by the tunnel initiator during the
				authentication phase of tunnel establishment.  It MAY be used in an
				authorization request as a hint to the server that a specific
				preference is desired, but the server is not required to honor the
				hint in the corresponding response.  This AVP MUST be present in the
				authorization response if an authentication name other than the
				default is desired.  This AVP SHOULD be included in the Accounting-
				Request messages pertaining to the tunneled session.
   			*/
			struct dict_avp_data adata = { 
					90, 					/* Code */
					0, 					/* Vendor */
					"Tunnel-Client-Auth-Id", 		/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,			/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &adata , UTF8String_type, NULL);
		}
		
		/* Tunnel-Server-Auth-Id */
		{
			/*
				The Tunnel-Server-Auth-Id AVP (AVP Code 91) is of type UTF8String and
				specifies the name used by the tunnel terminator during the
				authentication phase of tunnel establishment.  It MAY be used in an
				authorization request as a hint to the server that a specific
				preference is desired, but the server is not required to honor the
				hint in the corresponding response.  This AVP MUST be present in the
				authorization response if an authentication name other than the
				default is desired.  This AVP SHOULD be included in the Accounting-
				Request messages pertaining to the tunneled session.
   			*/
			struct dict_avp_data adata = { 
					91, 					/* Code */
					0, 					/* Vendor */
					"Tunnel-Server-Auth-Id", 		/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,			/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &adata , UTF8String_type, NULL);
		}
		
		/* Tunneling */
		{
			/*
				The Tunneling AVP (AVP Code 401) is of type Grouped and contains the
				following AVPs, used to describe a compulsory tunnel service:
				[RADTunnels], [RADTunlAcct].  Its data field has the following ABNF
				grammar:

				Tunneling     ::= < AVP Header: 401 >
                				{ Tunnel-Type }
                				{ Tunnel-Medium-Type }
                				{ Tunnel-Client-Endpoint }
                				{ Tunnel-Server-Endpoint }
                				[ Tunnel-Preference ]
                				[ Tunnel-Client-Auth-Id ]
                				[ Tunnel-Server-Auth-Id ]
                				[ Tunnel-Assignment-Id ]
                				[ Tunnel-Password ]
                				[ Tunnel-Private-Group-Id ]
			*/
			struct dict_object * avp;
			struct dict_avp_data data = { 
					401, 					/* Code */
					0, 					/* Vendor */
					"Tunneling", 				/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,			/* Fixed flag values */
					AVP_TYPE_GROUPED 			/* base type of data */
					};
			struct local_rules_definition rules[] = 
						{ 	 {  "Tunnel-Type", 			RULE_REQUIRED, -1, 1 }
							,{  "Tunnel-Medium-Type",		RULE_OPTIONAL, -1, 1 }
							,{  "Tunnel-Client-Endpoint",		RULE_OPTIONAL, -1, 1 }
							,{  "Tunnel-Server-Endpoint",		RULE_OPTIONAL, -1, 1 }
							,{  "Tunnel-Preference",		RULE_OPTIONAL, -1, 1 }
							,{  "Tunnel-Client-Auth-Id",		RULE_OPTIONAL, -1, 1 }
							,{  "Tunnel-Server-Auth-Id",		RULE_OPTIONAL, -1, 1 }
							,{  "Tunnel-Assignment-Id",		RULE_OPTIONAL, -1, 1 }
							,{  "Tunnel-Password",			RULE_OPTIONAL, -1, 1 }
							,{  "Tunnel-Private-Group-Id",		RULE_OPTIONAL, -1, 1 }
						};
			
			CHECK_dict_new( DICT_AVP, &data , NULL, &avp);
			PARSE_loc_rules( rules, avp );
		}
		
/********************************
 *  NAS Accounting AVPs         *
 ********************************/		
		/* Accounting-Input-Octets */
		{
			/*
				The Accounting-Input-Octets AVP (AVP Code 363) is of type Unsigned64
				and contains the number of octets received from the user.
				
				For NAS usage, this AVP indicates how many octets have been received
				from the port in the course of this session.  It can only be present
				in ACR messages with an Accounting-Record-Type of INTERIM_RECORD or
				STOP_RECORD.
			*/
			struct dict_avp_data data = { 
					363, 					/* Code */
					0, 					/* Vendor */
					"Accounting-Input-Octets", 		/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED64 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Accounting-Output-Octets */
		{
			/*
				The Accounting-Output-Octets AVP (AVP Code 364) is of type Unsigned64
				and contains the number of octets sent to the user.

				For NAS usage, this AVP indicates how many octets have been sent to
				the port in the course of this session.  It can only be present in
				ACR messages with an Accounting-Record-Type of INTERIM_RECORD or
				STOP_RECORD.
			*/
			struct dict_avp_data data = { 
					364, 					/* Code */
					0, 					/* Vendor */
					"Accounting-Output-Octets", 		/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED64 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Accounting-Input-Packets */
		{
			/*
				The Accounting-Input-Packets (AVP Code 365) is of type Unsigned64 and
				contains the number of packets received from the user.

				For NAS usage, this AVP indicates how many packets have been received
				from the port over the course of a session being provided to a Framed
				User.  It can only be present in ACR messages with an Accounting-
				Record-Type of INTERIM_RECORD or STOP_RECORD.
			*/
			struct dict_avp_data data = { 
					365, 					/* Code */
					0, 					/* Vendor */
					"Accounting-Input-Packets", 		/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED64 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Accounting-Output-Packets */
		{
			/*
				The Accounting-Output-Packets (AVP Code 366) is of type Unsigned64
				and contains the number of IP packets sent to the user.

				For NAS usage, this AVP indicates how many packets have been sent to
				the port over the course of a session being provided to a Framed
				User.  It can only be present in ACR messages with an Accounting-
				Record-Type of INTERIM_RECORD or STOP_RECORD.
			*/
			struct dict_avp_data data = { 
					366, 					/* Code */
					0, 					/* Vendor */
					"Accounting-Output-Packets", 		/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED64 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Acct-Session-Time */
		{
			/*
				The Acct-Session-Time AVP (AVP Code 46) is of type Unsigned32 and
				indicates the length of the current session in seconds.  It can only
				be present in ACR messages with an Accounting-Record-Type of
				INTERIM_RECORD or STOP_RECORD.
			*/
			struct dict_avp_data data = { 
					46, 					/* Code */
					0, 					/* Vendor */
					"Acct-Session-Time", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Acct-Authentic */
		{
			/*
				The Acct-Authentic AVP (AVP Code 45) is of type Enumerated and
				specifies how the user was authenticated.  The supported values are
				listed in [RADIUSTypes].
				Sub-registry: Values for RADIUS Attribute 45, Acct-Authentic
				Reference: [RFC2866]
			*/
			struct dict_object 	*type;
			struct dict_type_data 	 tdata = { AVP_TYPE_UNSIGNED32,	"Enumerated(Acct-Authentic)"	, NULL, NULL};
			struct dict_enumval_data tvals[] = {
				enumval_def_u32( 1, "RADIUS"),
				enumval_def_u32( 2, "Local"),
				enumval_def_u32( 3, "Remote"),
				enumval_def_u32( 4, "Diameter")
			};
			struct dict_avp_data data = { 
					45, 					/* Code */
					0, 					/* Vendor */
					"Acct-Authentic", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			int i;
			/* Create the Enumerated type, enumerated values, and the AVP */
			CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type);
			for (i = 0; i < sizeof(tvals) / sizeof(tvals[0]); i++) {
				CHECK_dict_new( DICT_ENUMVAL, &tvals[i], type, NULL);
			}
			CHECK_dict_new( DICT_AVP, &data , type, NULL);
		}
		
		/* Accounting-Auth-Method */
		{
			/*
				The Accounting-Auth-Method AVP (AVP Code 406) is of type Enumerated.
				A NAS MAY include this AVP in an Accounting-Request message to
				indicate the method used to authenticate the user.  (Note that this
				is equivalent to the RADIUS MS-Acct-Auth-Type VSA attribute).

				The following values are defined:

				1  PAP
				2  CHAP
				3  MS-CHAP-1
				4  MS-CHAP-2
				5  EAP
				7  None
			*/
			struct dict_object 	*type;
			struct dict_type_data 	 tdata = { AVP_TYPE_UNSIGNED32,	"Enumerated(Accounting-Auth-Method)"	, NULL, NULL};
			struct dict_enumval_data tvals[] = {
				enumval_def_u32( 1, "PAP"),
				enumval_def_u32( 2, "CHAP"),
				enumval_def_u32( 3, "MS-CHAP-1"),
				enumval_def_u32( 4, "MS-CHAP-2"),
				enumval_def_u32( 5, "EAP"),
				enumval_def_u32( 7, "None")
			};
			struct dict_avp_data data = { 
					406, 					/* Code */
					0, 					/* Vendor */
					"Accounting-Auth-Method", 		/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			int i;
			/* Create the Enumerated type, enumerated values, and the AVP */
			CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type);
			for (i = 0; i < sizeof(tvals) / sizeof(tvals[0]); i++) {
				CHECK_dict_new( DICT_ENUMVAL, &tvals[i], type, NULL);
			}
			CHECK_dict_new( DICT_AVP, &data , type, NULL);
		}
		
		/* Acct-Delay-Time */
		{
			/*
				The Acct-Delay-Time AVP (AVP Code 41) is of type Unsigned32 and
				indicates the number of seconds the Diameter client has been trying
				to send the Accounting-Request (ACR).  The accounting server may
				subtract this value from the time when the ACR arrives at the server
				to calculate the approximate time of the event that caused the ACR to
				be generated.

				This AVP is not used for retransmissions at the transport level (TCP
				or SCTP).  Rather, it may be used when an ACR command cannot be
				transmitted because there is no appropriate peer to transmit it to or
				was rejected because it could not be delivered.  In these cases, the
				command MAY be buffered and transmitted later, when an appropriate
				peer-connection is available or after sufficient time has passed that
				the destination-host may be reachable and operational.  If the ACR is
				resent in this way, the Acct-Delay-Time AVP SHOULD be included.  The
				value of this AVP indicates the number of seconds that elapsed
				between the time of the first attempt at transmission and the current
				attempt.
			*/
			struct dict_avp_data data = { 
					41, 					/* Code */
					0, 					/* Vendor */
					"Acct-Delay-Time", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Acct-Link-Count */
		{
			/*
				The Acct-Link-Count AVP (AVP Code 51) is of type Unsigned32 and
				indicates the total number of links that have been active (current or
				closed) in a given multilink session at the time the accounting
				record is generated.  This AVP MAY be included in Accounting-Requests
				for any session that may be part of a multilink service.

				The Acct-Link-Count AVP may be used to make it easier for an
				accounting server to know when it has all the records for a given
				multilink service.  When the number of Accounting-Requests received
				with Accounting-Record-Type = STOP_RECORD and with the same Acct-
				Multi-Session-Id and unique Session-Ids equals the largest value of
				Acct-Link-Count seen in those Accounting-Requests, all STOP_RECORD
				Accounting-Requests for that multilink service have been received.

				The following example, showing eight Accounting-Requests, illustrates
				how the Acct-Link-Count AVP is used.  In the table below, only the
				relevant AVPs are shown, although additional AVPs containing
				accounting information will be present in the Accounting-Requests.

				Acct-Multi-                   Accounting-     Acct-
				Session-Id     Session-Id     Record-Type     Link-Count
				--------------------------------------------------------
				"...10"        "...10"      START_RECORD        1
				"...10"        "...11"      START_RECORD        2
				"...10"        "...11"      STOP_RECORD         2
				"...10"        "...12"      START_RECORD        3
				"...10"        "...13"      START_RECORD        4
				"...10"        "...12"      STOP_RECORD         4
				"...10"        "...13"      STOP_RECORD         4
				"...10"        "...10"      STOP_RECORD         4

			*/
			struct dict_avp_data data = { 
					51, 					/* Code */
					0, 					/* Vendor */
					"Acct-Link-Count", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Acct-Tunnel-Connection */
		{
			/*
				The Acct-Tunnel-Connection AVP (AVP Code 68) is of type OctetString
				and contains the identifier assigned to the tunnel session.  This
				AVP, along with the Tunnel-Client-Endpoint and Tunnel-Server-Endpoint
				AVPs, may be used to provide a means to uniquely identify a tunnel
				session for auditing purposes.

				The format of the identifier in this AVP depends upon the value of
				the Tunnel-Type AVP.  For example, to identify an L2TP tunnel
				connection fully, the L2TP Tunnel Id and Call Id might be encoded in
				this field.  The exact encoding of this field is implementation
				dependent.
			*/
			struct dict_avp_data data = { 
					68, 					/* Code */
					0, 					/* Vendor */
					"Acct-Tunnel-Connection", 		/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Acct-Tunnel-Packets-Lost */
		{
			/*
				The Acct-Tunnel-Packets-Lost AVP (AVP Code 86) is of type Unsigned32
				and contains the number of packets lost on a given link.
			*/
			struct dict_avp_data data = { 
					86, 					/* Code */
					0, 					/* Vendor */
					"Acct-Tunnel-Packets-Lost", 		/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
/***********************************
 *  Compatibility with RADIUS AVPs *
 ***********************************/
		/* NAS-Identifier */
		{
			/*
				The NAS-Identifier AVP (AVP Code 32) [RADIUS] is of type UTF8String
				and contains the identity of the NAS providing service to the user.
				This AVP SHOULD only be added by a RADIUS/Diameter Translation Agent.
				When this AVP is present, the Origin-Host AVP identifies the NAS
				providing service to the user.

				In RADIUS it would be possible for a rogue NAS to forge the NAS-
				Identifier attribute.  Diameter/RADIUS translation agents SHOULD
				attempt to check a received NAS-Identifier attribute against the
				source address of the RADIUS packet, by doing an A/AAAA RR query.  If
				the NAS-Identifier attribute contains an FQDN, then such a query
				would resolve to an IP address matching the source address.  However,
				the NAS-Identifier attribute is not required to contain an FQDN, so
				such a query could fail.  If it fails, an error should be logged, but
				no action should be taken, other than a reverse lookup on the source
				address and insert the resulting FQDN into the Route-Record AVP.

				Diameter agents and servers SHOULD check whether a NAS-Identifier AVP
				corresponds to an entry in the Route-Record AVP.  If no match is
				found, then an error is logged, but no other action is taken.
			*/
			struct dict_avp_data data = { 
					32, 					/* Code */
					0, 					/* Vendor */
					"NAS-Identifier", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , UTF8String_type, NULL);
		}
		
		/* NAS-IP-Address */
		{
			/*
				The NAS-IP-Address AVP (AVP Code 4) [RADIUS] is of type OctetString
				and contains the IP Address of the NAS providing service to the user.
				This AVP SHOULD only be added by a RADIUS/Diameter Translation Agent.
				When this AVP is present, the Origin-Host AVP identifies the NAS
				providing service to the user.

				In RADIUS it would be possible for a rogue NAS to forge the NAS-IP-
				Address attribute value.  Diameter/RADIUS translation agents MUST
				check a received NAS-IP-Address or NAS-IPv6-Address attribute against
				the source address of the RADIUS packet.  If they do not match and
				the Diameter/RADIUS translation agent does not know whether the
				packet was sent by a RADIUS proxy or NAS (e.g., no Proxy-State
				attribute), then by default it is assumed that the source address
				corresponds to a RADIUS proxy, and that the NAS Address is behind
				that proxy, potentially with some additional RADIUS proxies in
				between.  The Diameter/RADIUS translation agent MUST insert entries
				in the Route-Record AVP corresponding to the apparent route.  This
				implies doing a reverse lookup on the source address and NAS-IP-
				Address or NAS-IPv6-Address attributes to determine the corresponding
				FQDNs.

				If the source address and the NAS-IP-Address or NAS-IPv6-Address do
				not match, and the Diameter/RADIUS translation agent knows that it is
				talking directly to the NAS (e.g., there are no RADIUS proxies
				between it and the NAS), then the error should be logged, and the
				packet MUST be discarded.

				Diameter agents and servers MUST check whether the NAS-IP-Address AVP
				corresponds to an entry in the Route-Record AVP.  This is done by
				doing a reverse lookup (PTR RR) for the NAS-IP-Address to retrieve
				the corresponding FQDN, and by checking for a match with the Route-
				Record AVP.  If no match is found, then an error is logged, but no
				other action is taken.
			*/
			struct dict_avp_data data = { 
					4, 					/* Code */
					0, 					/* Vendor */
					"NAS-IP-Address", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* NAS-IPv6-Address */
		{
			/*
				The NAS-IPv6-Address AVP (AVP Code 95) [RADIUSIPv6] is of type
				OctetString and contains the IPv6 Address of the NAS providing
				service to the user.  This AVP SHOULD only be added by a
				RADIUS/Diameter Translation Agent.  When this AVP is present, the
				Origin-Host AVP identifies the NAS providing service to the user.

				In RADIUS it would be possible for a rogue NAS to forge the NAS-
				IPv6-Address attribute.  Diameter/RADIUS translation agents MUST
				check a received NAS-IPv6-Address attribute against the source
				address of the RADIUS packet.  If they do not match and the
				Diameter/RADIUS translation agent does not know whether the packet
				was sent by a RADIUS proxy or NAS (e.g., no Proxy-State attribute),
				then by default it is assumed that the source address corresponds to
				a RADIUS proxy, and that the NAS-IPv6-Address is behind that proxy,
				potentially with some additional RADIUS proxies in between.  The
				Diameter/RADIUS translation agent MUST insert entries in the Route-
				Record AVP corresponding to the apparent route.  This implies doing a
				reverse lookup on the source address and NAS-IPv6-Address attributes
				to determine the corresponding FQDNs.

				If the source address and the NAS-IPv6-Address do not match, and the
				Diameter/RADIUS translation agent knows that it is talking directly
				to the NAS (e.g., there are no RADIUS proxies between it and the
				NAS), then the error should be logged, and the packet MUST be
				discarded.

				Diameter agents and servers MUST check whether the NAS-IPv6-Address
				AVP corresponds to an entry in the Route-Record AVP.  This is done by
				doing a reverse lookup (PTR RR) for the NAS-IPv6-Address to retrieve
				the corresponding FQDN, and by checking for a match with the Record-
				Route AVP.  If no match is found, then an error is logged, but no
				other action is taken.
			*/
			struct dict_avp_data data = { 
					95, 					/* Code */
					0, 					/* Vendor */
					"NAS-IPv6-Address", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* State */
		{
			/*
				The State AVP (AVP Code 24) [RADIUS] is of type OctetString and has
				two uses in the Diameter NAS application.

				The State AVP MAY be sent by a Diameter Server to a NAS in an AA-
				Response command that contains a Result-Code of
				DIAMETER_MULTI_ROUND_AUTH.  If so, the NAS MUST return it unmodified
				in the subsequent AA-Request command.

				The State AVP MAY also be sent by a Diameter Server to a NAS in an
				AA-Response command that also includes a Termination-Action AVP with
				the value of AA-REQUEST.  If the NAS performs the Termination-Action
				by sending a new AA-Request command upon termination of the current
				service, it MUST return the State AVP unmodified in the new request
				command.

				In either usage, the NAS MUST NOT interpret the AVP locally.  Usage
				of the State AVP is implementation dependent.
			*/
			struct dict_avp_data data = { 
					24, 					/* Code */
					0, 					/* Vendor */
					"State", 				/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_OCTETSTRING 			/* base type of data */
					};
			CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
		}
		
		/* Termination-Cause mapping */
		{
			
			struct dict_object 	*type;
			struct dict_enumval_data tvals[] = {
				enumval_def_u32(11, "[RADIUS] User Request"),
				enumval_def_u32(12, "[RADIUS] Lost Carrier"),
				enumval_def_u32(13, "[RADIUS] Lost Service"),
				enumval_def_u32(14, "[RADIUS] Idle Timeout"),
				enumval_def_u32(15, "[RADIUS] Session Timeout"),
				enumval_def_u32(16, "[RADIUS] Admin Reset"),
				enumval_def_u32(17, "[RADIUS] Admin Reboot"),
				enumval_def_u32(18, "[RADIUS] Port Error"),
				enumval_def_u32(19, "[RADIUS] NAS Error"),
				enumval_def_u32(20, "[RADIUS] NAS Request"),
				enumval_def_u32(21, "[RADIUS] NAS Reboot"),
				enumval_def_u32(22, "[RADIUS] Port Unneeded"),
				enumval_def_u32(23, "[RADIUS] Port Preempted"),
				enumval_def_u32(24, "[RADIUS] Port Suspended"),
				enumval_def_u32(25, "[RADIUS] Service Unavailable"),
				enumval_def_u32(26, "[RADIUS] Callback"),
				enumval_def_u32(27, "[RADIUS] User Error"),
				enumval_def_u32(28, "[RADIUS] Host Request"),
				enumval_def_u32(29, "[RADIUS] Supplicant Restart"),
				enumval_def_u32(30, "[RADIUS] Reauthentication Failure"),
				enumval_def_u32(31, "[RADIUS] Port Reinit"),
				enumval_def_u32(32, "[RADIUS] Port Disabled")
				};
			int i;

			CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "Enumerated(Termination-Cause)", &type);
			for (i = 0; i < sizeof(tvals) / sizeof(tvals[0]); i++) {
				CHECK_dict_new( DICT_ENUMVAL, &tvals[i], type, NULL);
			}
			
		}
		
		/* Origin-AAA-Protocol */
		{
			/*
				The Origin-AAA-Protocol AVP (AVP Code 408) is of the type Enumerated
				and should be inserted in a Diameter message translated by a gateway
				system from another AAA protocol, such as RADIUS.  It identifies the
				source protocol of the message to the Diameter system receiving the
				message.

				The supported values are:

				 1       RADIUS
			*/
			struct dict_object 	*type;
			struct dict_type_data 	 tdata = { AVP_TYPE_UNSIGNED32,	"Enumerated(Origin-AAA-Protocol)"	, NULL, NULL};
			struct dict_enumval_data tvals[] = {
				enumval_def_u32( 1, "RADIUS")
			};
			struct dict_avp_data data = { 
					408, 					/* Code */
					0, 					/* Vendor */
					"Origin-AAA-Protocol", 			/* Name */
					AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, 	/* Fixed flags */
					AVP_FLAG_MANDATORY,		 	/* Fixed flag values */
					AVP_TYPE_UNSIGNED32 			/* base type of data */
					};
			int i;
			/* Create the Enumerated type, enumerated values, and the AVP */
			CHECK_dict_new( DICT_TYPE, &tdata , NULL, &type);
			for (i = 0; i < sizeof(tvals) / sizeof(tvals[0]); i++) {
				CHECK_dict_new( DICT_ENUMVAL, &tvals[i], type, NULL);
			}
			CHECK_dict_new( DICT_AVP, &data , type, NULL);
		}
		
	}

/********************/		
/* Commands section */
/********************/		
	{
		/* To avoid defining global variables for all the AVP that we use here, we do search the dictionary in each sub-block.
		 * This is far from optimal, but the code is clearer like this, and the time it requires at execution is not noticeable.
		 */
		
		/* AA-Request (AAR) Command */
		{
			/*
				The AA-Request (AAR), which is indicated by setting the Command-Code
				field to 265 and the 'R' bit in the Command Flags field, is used to
				request authentication and/or authorization for a given NAS user.
				The type of request is identified through the Auth-Request-Type AVP
				[BASE].  The recommended value for most RADIUS interoperabily
				situations is AUTHORIZE_AUTHENTICATE.

				If Authentication is requested, the User-Name attribute SHOULD be
				present, as well as any additional authentication AVPs that would
				carry the password information.  A request for authorization SHOULD
				only include the information from which the authorization will be
				performed, such as the User-Name, Called-Station-Id, or Calling-
				Station-Id AVPs.  All requests SHOULD contain AVPs uniquely
				identifying the source of the call, such as Origin-Host and NAS-Port.
				Certain networks MAY use different AVPs for authorization purposes.
				A request for authorization will include some AVPs defined in section
				6.

				It is possible for a single session to be authorized first and then
				for an authentication request to follow.

				This AA-Request message MAY be the result of a multi-round
				authentication exchange, which occurs when the AA-Answer message is
				received with the Result-Code AVP set to DIAMETER_MULTI_ROUND_AUTH.
				A subsequent AAR message SHOULD be sent, with the User-Password AVP
				that includes the user's response to the prompt, and MUST include any
				State AVPs that were present in the AAA message.

				Message Format
				<AA-Request> ::= < Diameter Header: 265, REQ, PXY >
        				       < Session-Id >
        				       { Auth-Application-Id }
        				       { Origin-Host }
        				       { Origin-Realm }
        				       { Destination-Realm }
        				       { Auth-Request-Type }
        				       [ Destination-Host ]
        				       [ NAS-Identifier ]
        				       [ NAS-IP-Address ]
        				       [ NAS-IPv6-Address ]
        				       [ NAS-Port ]
        				       [ NAS-Port-Id ]
        				       [ NAS-Port-Type ]
        				       [ Origin-AAA-Protocol ]
        				       [ Origin-State-Id ]
        				       [ Port-Limit ]
        				       [ User-Name ]
        				       [ User-Password ]
        				       [ Service-Type ]
        				       [ State ]
        				       [ Authorization-Lifetime ]
        				       [ Auth-Grace-Period ]
        				       [ Auth-Session-State ]
        				       [ Callback-Number ]
        				       [ Called-Station-Id ]
        				       [ Calling-Station-Id ]
        				       [ Originating-Line-Info ]
        				       [ Connect-Info ]
        				       [ CHAP-Auth ]
        				       [ CHAP-Challenge ]
        				     * [ Framed-Compression ]
        				       [ Framed-Interface-Id ]
        				       [ Framed-IP-Address ]
        				     * [ Framed-IPv6-Prefix ]
        				       [ Framed-IP-Netmask ]
        				       [ Framed-MTU ]
        				       [ Framed-Protocol ]
        				       [ ARAP-Password ]
        				       [ ARAP-Security ]
        				     * [ ARAP-Security-Data ]
        				     * [ Login-IP-Host ]
        				     * [ Login-IPv6-Host ]
        				       [ Login-LAT-Group ]
        				       [ Login-LAT-Node ]
        				       [ Login-LAT-Port ]
        				       [ Login-LAT-Service ]
        				     * [ Tunneling ]
        				     * [ Proxy-Info ]
        				     * [ Route-Record ]
        				     * [ AVP ]
			*/
			struct dict_object * cmd;
			struct dict_cmd_data data = { 
					265, 					/* Code */
					"AA-Request", 				/* Name */
					CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
					CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE 			/* Fixed flag values */
					};
			struct local_rules_definition rules[] = 
						{ 	 {  "Session-Id", 			RULE_FIXED_HEAD, -1, 1 }
						 	,{  "Auth-Application-Id", 		RULE_REQUIRED,   -1, 1 }
						 	,{  "Origin-Host", 			RULE_REQUIRED,   -1, 1 }
							,{  "Origin-Realm",			RULE_REQUIRED,   -1, 1 }
							,{  "Destination-Realm",		RULE_REQUIRED,   -1, 1 }
						 	,{  "Auth-Request-Type", 		RULE_REQUIRED,   -1, 1 }
							,{  "Destination-Host",			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Identifier",			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-IP-Address",			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-IPv6-Address",			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Port",				RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Port-Id",			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Port-Type",			RULE_OPTIONAL,   -1, 1 }
							,{  "Origin-AAA-Protocol",		RULE_OPTIONAL,   -1, 1 }
							,{  "Origin-State-Id",			RULE_OPTIONAL,   -1, 1 }
							,{  "Port-Limit",			RULE_OPTIONAL,   -1, 1 }
							,{  "User-Name",			RULE_OPTIONAL,   -1, 1 }
							,{  "User-Password",			RULE_OPTIONAL,   -1, 1 }
							,{  "Service-Type",			RULE_OPTIONAL,   -1, 1 }
							,{  "State",				RULE_OPTIONAL,   -1, 1 }
							,{  "Authorization-Lifetime",		RULE_OPTIONAL,   -1, 1 }
							,{  "Auth-Grace-Period",		RULE_OPTIONAL,   -1, 1 }
							,{  "Auth-Session-State",		RULE_OPTIONAL,   -1, 1 }
							,{  "Callback-Number",			RULE_OPTIONAL,   -1, 1 }
							,{  "Called-Station-Id",		RULE_OPTIONAL,   -1, 1 }
							,{  "Calling-Station-Id",		RULE_OPTIONAL,   -1, 1 }
							,{  "Originating-Line-Info",		RULE_OPTIONAL,   -1, 1 }
							,{  "Connect-Info",			RULE_OPTIONAL,   -1, 1 }
							,{  "CHAP-Auth",			RULE_OPTIONAL,   -1, 1 }
							,{  "CHAP-Challenge",			RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-Compression",		RULE_OPTIONAL,   -1,-1 }
							,{  "Framed-Interface-Id",		RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-IP-Address",		RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-IPv6-Prefix",		RULE_OPTIONAL,   -1,-1 }
							,{  "Framed-IP-Netmask",		RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-MTU",			RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-Protocol",			RULE_OPTIONAL,   -1, 1 }
							,{  "ARAP-Password",			RULE_OPTIONAL,   -1, 1 }
							,{  "ARAP-Security",			RULE_OPTIONAL,   -1, 1 }
							,{  "ARAP-Security-Data",		RULE_OPTIONAL,   -1,-1 }
							,{  "Login-IP-Host",			RULE_OPTIONAL,   -1,-1 }
							,{  "Login-IPv6-Host",			RULE_OPTIONAL,   -1,-1 }
							,{  "Login-LAT-Group",			RULE_OPTIONAL,   -1, 1 }
							,{  "Login-LAT-Node",			RULE_OPTIONAL,   -1, 1 }
							,{  "Login-LAT-Port",			RULE_OPTIONAL,   -1, 1 }
							,{  "Login-LAT-Service",		RULE_OPTIONAL,   -1, 1 }
							,{  "Tunneling",			RULE_OPTIONAL,   -1,-1 }
							,{  "Proxy-Info",			RULE_OPTIONAL,   -1,-1 }
							,{  "Route-Record",			RULE_OPTIONAL,   -1,-1 }
						};
			
			CHECK_dict_new( DICT_COMMAND, &data , nasreq, &cmd);
			PARSE_loc_rules( rules, cmd );
		}
		
		/* AA-Answer (AAA) Command */
		{
			/*
				The AA-Answer (AAA) message is indicated by setting the Command-Code
				field to 265 and clearing the 'R' bit in the Command Flags field.  It
				is sent in response to the AA-Request (AAR) message.  If
				authorization was requested, a successful response will include the
				authorization AVPs appropriate for the service being provided, as
				defined in section 6.

				For authentication exchanges requiring more than a single round trip,
				the server MUST set the Result-Code AVP to DIAMETER_MULTI_ROUND_AUTH.
				An AAA message with this result code MAY include one Reply-Message or
				more and MAY include zero or one State AVPs.

				If the Reply-Message AVP was present, the network access server
				SHOULD send the text to the user's client to display to the user,
				instructing the client to prompt the user for a response.  For
				example, this capability can be achieved in PPP via PAP.  If the
				access client is unable to prompt the user for a new response, it
				MUST treat the AA-Answer (AAA) with the Reply-Message AVP as an error
				and deny access.

				Message Format

				<AA-Answer> ::= < Diameter Header: 265, PXY >
        				      < Session-Id >
        				      { Auth-Application-Id }
        				      { Auth-Request-Type }
        				      { Result-Code }
        				      { Origin-Host }
        				      { Origin-Realm }
        				      [ User-Name ]
        				      [ Service-Type ]
        				    * [ Class ]
        				    * [ Configuration-Token ]
        				      [ Acct-Interim-Interval ]
        				      [ Error-Message ]
        				      [ Error-Reporting-Host ]
        				    * [ Failed-AVP ]
        				      [ Idle-Timeout ]
        				      [ Authorization-Lifetime ]
        				      [ Auth-Grace-Period ]
        				      [ Auth-Session-State ]
        				      [ Re-Auth-Request-Type ]
        				      [ Multi-Round-Time-Out ]
        				      [ Session-Timeout ]
        				      [ State ]
        				    * [ Reply-Message ]
        				      [ Origin-AAA-Protocol ]
        				      [ Origin-State-Id ]
        				    * [ Filter-Id ]
        				      [ Password-Retry ]
        				      [ Port-Limit ]
        				      [ Prompt ]
        				      [ ARAP-Challenge-Response ]
        				      [ ARAP-Features ]
        				      [ ARAP-Security ]
        				    * [ ARAP-Security-Data ]
        				      [ ARAP-Zone-Access ]
        				      [ Callback-Id ]
        				      [ Callback-Number ]
        				      [ Framed-Appletalk-Link ]
        				    * [ Framed-Appletalk-Network ]
        				      [ Framed-Appletalk-Zone ]
        				    * [ Framed-Compression ]
        				      [ Framed-Interface-Id ]
        				      [ Framed-IP-Address ]
        				    * [ Framed-IPv6-Prefix ]
        				      [ Framed-IPv6-Pool ]
        				    * [ Framed-IPv6-Route ]
        				      [ Framed-IP-Netmask ]
        				    * [ Framed-Route ]
        				      [ Framed-Pool ]
        				      [ Framed-IPX-Network ]
        				      [ Framed-MTU ]
        				      [ Framed-Protocol ]
        				      [ Framed-Routing ]
        				    * [ Login-IP-Host ]
        				    * [ Login-IPv6-Host ]
        				      [ Login-LAT-Group ]
        				      [ Login-LAT-Node ]
        				      [ Login-LAT-Port ]
        				      [ Login-LAT-Service ]
        				      [ Login-Service ]
        				      [ Login-TCP-Port ]
        				    * [ NAS-Filter-Rule ]
        				    * [ QoS-Filter-Rule ]
        				    * [ Tunneling ]
        				    * [ Redirect-Host ]
        				      [ Redirect-Host-Usage ]
        				      [ Redirect-Max-Cache-Time ]
        				    * [ Proxy-Info ]
        				    * [ AVP ]
			*/
			struct dict_object * cmd;
			struct dict_cmd_data data = { 
					265, 					/* Code */
					"AA-Answer", 				/* Name */
					CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE,	/* Fixed flags */
							   CMD_FLAG_PROXIABLE	/* Fixed flag values */
					};
			struct local_rules_definition rules[] = 
						{ 	 {  "Session-Id", 			RULE_FIXED_HEAD, -1, 1 }
						 	,{  "Auth-Application-Id", 		RULE_REQUIRED,   -1, 1 }
						 	,{  "Auth-Request-Type", 		RULE_REQUIRED,   -1, 1 }
						 	,{  "Result-Code", 			RULE_REQUIRED,   -1, 1 }
						 	,{  "Origin-Host", 			RULE_REQUIRED,   -1, 1 }
							,{  "Origin-Realm",			RULE_REQUIRED,   -1, 1 }
							,{  "User-Name",			RULE_OPTIONAL,   -1, 1 }
							,{  "Service-Type",			RULE_OPTIONAL,   -1, 1 }
							,{  "Class",				RULE_OPTIONAL,   -1,-1 }
							,{  "Configuration-Token",		RULE_OPTIONAL,   -1,-1 }
							,{  "Acct-Interim-Interval",		RULE_OPTIONAL,   -1, 1 }
							,{  "Error-Message",			RULE_OPTIONAL,   -1, 1 }
							,{  "Error-Reporting-Host",		RULE_OPTIONAL,   -1, 1 }
							,{  "Failed-AVP",			RULE_OPTIONAL,   -1,-1 }
							,{  "Idle-Timeout",			RULE_OPTIONAL,   -1, 1 }
							,{  "Authorization-Lifetime",		RULE_OPTIONAL,   -1, 1 }
							,{  "Auth-Grace-Period",		RULE_OPTIONAL,   -1, 1 }
							,{  "Auth-Session-State",		RULE_OPTIONAL,   -1, 1 }
							,{  "Re-Auth-Request-Type",		RULE_OPTIONAL,   -1, 1 }
							,{  "Multi-Round-Time-Out",		RULE_OPTIONAL,   -1, 1 }
							,{  "Session-Timeout",			RULE_OPTIONAL,   -1, 1 }
							,{  "State",				RULE_OPTIONAL,   -1, 1 }
							,{  "Reply-Message",			RULE_OPTIONAL,   -1,-1 }
							,{  "Origin-AAA-Protocol",		RULE_OPTIONAL,   -1, 1 }
							,{  "Origin-State-Id",			RULE_OPTIONAL,   -1, 1 }
							,{  "Filter-Id",			RULE_OPTIONAL,   -1,-1 }
							,{  "Password-Retry",			RULE_OPTIONAL,   -1, 1 }
							,{  "Port-Limit",			RULE_OPTIONAL,   -1, 1 }
							,{  "Prompt",				RULE_OPTIONAL,   -1, 1 }
							,{  "ARAP-Challenge-Response",		RULE_OPTIONAL,   -1, 1 }
							,{  "ARAP-Features",			RULE_OPTIONAL,   -1, 1 }
							,{  "ARAP-Security",			RULE_OPTIONAL,   -1, 1 }
							,{  "ARAP-Security-Data",		RULE_OPTIONAL,   -1,-1 }
							,{  "ARAP-Zone-Access",			RULE_OPTIONAL,   -1, 1 }
							,{  "Callback-Id",			RULE_OPTIONAL,   -1, 1 }
							,{  "Callback-Number",			RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-AppleTalk-Link",		RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-AppleTalk-Network",		RULE_OPTIONAL,   -1,-1 }
							,{  "Framed-AppleTalk-Zone",		RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-Compression",		RULE_OPTIONAL,   -1,-1 }
							,{  "Framed-Interface-Id",		RULE_OPTIONAL,   -1,-1 }
							,{  "Framed-IP-Address",		RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-IPv6-Prefix",		RULE_OPTIONAL,   -1,-1 }
							,{  "Framed-IPv6-Pool",			RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-IPv6-Route",		RULE_OPTIONAL,   -1,-1 }
							,{  "Framed-IP-Netmask",		RULE_OPTIONAL,   -1,-1 }
							,{  "Framed-Route",			RULE_OPTIONAL,   -1,-1 }
							,{  "Framed-Pool",			RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-IPX-Network",		RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-MTU",			RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-Protocol",			RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-Routing",			RULE_OPTIONAL,   -1, 1 }
							,{  "Login-IP-Host",			RULE_OPTIONAL,   -1,-1 }
							,{  "Login-IPv6-Host",			RULE_OPTIONAL,   -1,-1 }
							,{  "Login-LAT-Group",			RULE_OPTIONAL,   -1, 1 }
							,{  "Login-LAT-Node",			RULE_OPTIONAL,   -1, 1 }
							,{  "Login-LAT-Port",			RULE_OPTIONAL,   -1, 1 }
							,{  "Login-LAT-Service",		RULE_OPTIONAL,   -1, 1 }
							,{  "Login-Service",			RULE_OPTIONAL,   -1, 1 }
							,{  "Login-TCP-Port",			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Filter-Rule",			RULE_OPTIONAL,   -1,-1 }
							,{  "QoS-Filter-Rule",			RULE_OPTIONAL,   -1,-1 }
							,{  "Tunneling",			RULE_OPTIONAL,   -1,-1 }
							,{  "Redirect-Host",			RULE_OPTIONAL,   -1,-1 }
							,{  "Redirect-Host-Usage",		RULE_OPTIONAL,   -1, 1 }
							,{  "Redirect-Max-Cache-Time",		RULE_OPTIONAL,   -1, 1 }
							,{  "Proxy-Info",			RULE_OPTIONAL,   -1,-1 }
						};
			
			CHECK_dict_new( DICT_COMMAND, &data , nasreq, &cmd);
			PARSE_loc_rules( rules, cmd );
		}
		
		/* Re-Auth-Request */
		{
			/*
				Add additional rules of the ABNF (compared to Base definition):
				
			<RA-Request>  ::= < Diameter Header: 258, REQ, PXY >
        			       < Session-Id >
        			       { Origin-Host }
        			       { Origin-Realm }
        			       { Destination-Realm }
        			       { Destination-Host }
        			       { Auth-Application-Id }
        			       { Re-Auth-Request-Type }
        			       [ User-Name ]
        			       [ Origin-AAA-Protocol ]
        			       [ Origin-State-Id ]
        			       [ NAS-Identifier ]
        			       [ NAS-IP-Address ]
        			       [ NAS-IPv6-Address ]
        			       [ NAS-Port ]
        			       [ NAS-Port-Id ]
        			       [ NAS-Port-Type ]
        			       [ Service-Type ]
        			       [ Framed-IP-Address ]
        			       [ Framed-IPv6-Prefix ]
        			       [ Framed-Interface-Id ]
        			       [ Called-Station-Id ]
        			       [ Calling-Station-Id ]
        			       [ Originating-Line-Info ]
        			       [ Acct-Session-Id ]
        			       [ Acct-Multi-Session-Id ]
        			       [ State ]
        			     * [ Class ]
        			       [ Reply-Message ]
        			     * [ Proxy-Info ]
        			     * [ Route-Record ]
        			     * [ AVP ]
			*/
			struct dict_object * cmd;
			struct local_rules_definition rules[] = 
						{ 	 {  "Origin-AAA-Protocol",		RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Identifier",			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-IP-Address",			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-IPv6-Address",			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Port",				RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Port-Id",			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Port-Type",			RULE_OPTIONAL,   -1, 1 }
							,{  "Service-Type",			RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-IP-Address",		RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-IPv6-Prefix",		RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-Interface-Id",		RULE_OPTIONAL,   -1, 1 }
							,{  "Called-Station-Id",		RULE_OPTIONAL,   -1, 1 }
							,{  "Calling-Station-Id",		RULE_OPTIONAL,   -1, 1 }
							,{  "Originating-Line-Info",		RULE_OPTIONAL,   -1, 1 }
							,{  "Acct-Session-Id",			RULE_OPTIONAL,   -1, 1 }
							,{  "Acct-Multi-Session-Id",		RULE_OPTIONAL,   -1, 1 }
							,{  "State",				RULE_OPTIONAL,   -1, 1 }
							,{  "Class",				RULE_OPTIONAL,   -1,-1 }
							,{  "Reply-Message",			RULE_OPTIONAL,   -1,-1 }
						};
			
			CHECK_dict_search( DICT_COMMAND, CMD_BY_NAME, "Re-Auth-Request", &cmd);
			PARSE_loc_rules( rules, cmd );
		}
		
		/* Re-Auth-Answer */
		{
			/*
				Add additional rules of the ABNF (compared to Base definition):
				

				<RA-Answer>  ::= < Diameter Header: 258, PXY >
        				       < Session-Id >
        				       { Result-Code }
        				       { Origin-Host }
        				       { Origin-Realm }
        				       [ User-Name ]
        				       [ Origin-AAA-Protocol ]
        				       [ Origin-State-Id ]
        				       [ Error-Message ]
        				       [ Error-Reporting-Host ]
        				     * [ Failed-AVP ]
        				     * [ Redirected-Host ]
        				       [ Redirected-Host-Usage ]
        				       [ Redirected-Host-Cache-Time ]
        				       [ Service-Type ]
        				     * [ Configuration-Token ]
        				       [ Idle-Timeout ]
        				       [ Authorization-Lifetime ]
        				       [ Auth-Grace-Period ]
        				       [ Re-Auth-Request-Type ]
        				       [ State ]
        				     * [ Class ]
        				     * [ Reply-Message ]
        				       [ Prompt ]
        				     * [ Proxy-Info ]
        				     * [ AVP ]
			*/
			struct dict_object * cmd;
			struct local_rules_definition rules[] = 
						{ 	 {  "Origin-AAA-Protocol",		RULE_OPTIONAL,   -1, 1 }
							,{  "Service-Type",			RULE_OPTIONAL,   -1, 1 }
							,{  "Configuration-Token",		RULE_OPTIONAL,   -1,-1 }
							,{  "Idle-Timeout",			RULE_OPTIONAL,   -1, 1 }
							,{  "Authorization-Lifetime",		RULE_OPTIONAL,   -1, 1 }
							,{  "Auth-Grace-Period",		RULE_OPTIONAL,   -1, 1 }
							,{  "Re-Auth-Request-Type",		RULE_OPTIONAL,   -1, 1 }
							,{  "State",				RULE_OPTIONAL,   -1, 1 }
							,{  "Class",				RULE_OPTIONAL,   -1,-1 }
							,{  "Reply-Message",			RULE_OPTIONAL,   -1,-1 }
							,{  "Prompt",				RULE_OPTIONAL,   -1, 1 }
						};
			
			CHECK_dict_search( DICT_COMMAND, CMD_BY_NAME, "Re-Auth-Answer", &cmd);
			PARSE_loc_rules( rules, cmd );
		}
		
		/* Session-Termination-Request */
		{
			/*
				Add additional rules of the ABNF (compared to Base definition):
				

				<ST-Request> ::= < Diameter Header: 275, REQ, PXY >
        				      < Session-Id >
        				      { Origin-Host }
        				      { Origin-Realm }
        				      { Destination-Realm }
        				      { Auth-Application-Id }
        				      { Termination-Cause }
        				      [ User-Name ]
        				      [ Destination-Host ]
        				    * [ Class ]
        				      [ Origin-AAA-Protocol ]
        				      [ Origin-State-Id ]
        				    * [ Proxy-Info ]
        				    * [ Route-Record ]
        				    * [ AVP ]
			*/
			struct dict_object * cmd;
			struct local_rules_definition rules[] = 
						{ 	 {  "Origin-AAA-Protocol",		RULE_OPTIONAL,   -1, 1 }
						};
			
			CHECK_dict_search( DICT_COMMAND, CMD_BY_NAME, "Session-Termination-Request", &cmd);
			PARSE_loc_rules( rules, cmd );
		}
		
		/* Session-Termination-Answer */
		{
			/*
				Add additional rules of the ABNF (compared to Base definition):
				
				<ST-Answer>  ::= < Diameter Header: 275, PXY >
        				       < Session-Id >
        				       { Result-Code }
        				       { Origin-Host }
        				       { Origin-Realm }
        				       [ User-Name ]
        				     * [ Class ]
        				       [ Error-Message ]
        				       [ Error-Reporting-Host ]
        				     * [ Failed-AVP ]
        				       [ Origin-AAA-Protocol ]
        				       [ Origin-State-Id ]
        				     * [ Redirect-Host ]
        				       [ Redirect-Host-Usase ]
        				       [ Redirect-Max-Cache-Time ]
        				     * [ Proxy-Info ]
        				     * [ AVP ]
			*/
			struct dict_object * cmd;
			struct local_rules_definition rules[] = 
						{ 	 {  "Origin-AAA-Protocol",		RULE_OPTIONAL,   -1, 1 }
						};
			
			CHECK_dict_search( DICT_COMMAND, CMD_BY_NAME, "Session-Termination-Answer", &cmd);
			PARSE_loc_rules( rules, cmd );
		}
		
		/* Abort-Session-Request */
		{
			/*
				Add additional rules of the ABNF (compared to Base definition):
				
			<AS-Request>  ::= < Diameter Header: 274, REQ, PXY >
        			       < Session-Id >
        			       { Origin-Host }
        			       { Origin-Realm }
        			       { Destination-Realm }
        			       { Destination-Host }
        			       { Auth-Application-Id }
        			       [ User-Name ]
        			       [ Origin-AAA-Protocol ]
        			       [ Origin-State-Id ]
        			       [ NAS-Identifier ]
        			       [ NAS-IP-Address ]
        			       [ NAS-IPv6-Address ]
        			       [ NAS-Port ]
        			       [ NAS-Port-Id ]
        			       [ NAS-Port-Type ]
        			       [ Service-Type ]
        			       [ Framed-IP-Address ]
        			       [ Framed-IPv6-Prefix ]
        			       [ Framed-Interface-Id ]
        			       [ Called-Station-Id ]
        			       [ Calling-Station-Id ]
        			       [ Originating-Line-Info ]
        			       [ Acct-Session-Id ]
        			       [ Acct-Multi-Session-Id ]
        			       [ State ]
        			     * [ Class ]
        			     * [ Reply-Message ]
        			     * [ Proxy-Info ]
        			     * [ Route-Record ]
        			     * [ AVP ]
				     
			*/
			struct dict_object * cmd;
			struct local_rules_definition rules[] = 
						{ 	 {  "Origin-AAA-Protocol",		RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Identifier",			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-IP-Address",			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-IPv6-Address",			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Port",				RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Port-Id",			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Port-Type",			RULE_OPTIONAL,   -1, 1 }
							,{  "Service-Type",			RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-IP-Address",		RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-IPv6-Prefix",		RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-Interface-Id",		RULE_OPTIONAL,   -1, 1 }
							,{  "Called-Station-Id",		RULE_OPTIONAL,   -1, 1 }
							,{  "Calling-Station-Id",		RULE_OPTIONAL,   -1, 1 }
							,{  "Originating-Line-Info",		RULE_OPTIONAL,   -1, 1 }
							,{  "Acct-Session-Id",			RULE_OPTIONAL,   -1, 1 }
							,{  "Acct-Multi-Session-Id",		RULE_OPTIONAL,   -1, 1 }
							,{  "State",				RULE_OPTIONAL,   -1, 1 }
							,{  "Class",				RULE_OPTIONAL,   -1,-1 }
							,{  "Reply-Message",			RULE_OPTIONAL,   -1,-1 }
						};
			
			CHECK_dict_search( DICT_COMMAND, CMD_BY_NAME, "Abort-Session-Request", &cmd);
			PARSE_loc_rules( rules, cmd );
		}
		
		/* Abort-Session-Answer */
		{
			/*
				Add additional rules of the ABNF (compared to Base definition):

				<AS-Answer>  ::= < Diameter Header: 274, PXY >
        				       < Session-Id >
        				       { Result-Code }
        				       { Origin-Host }
        				       { Origin-Realm }
        				       [ User-Name ]
        				       [ Origin-AAA-Protocol ]
        				       [ Origin-State-Id ]
        				       [ State]
        				       [ Error-Message ]
        				       [ Error-Reporting-Host ]
        				     * [ Failed-AVP ]
        				     * [ Redirected-Host ]
        				       [ Redirected-Host-Usage ]
        				       [ Redirected-Max-Cache-Time ]
        				     * [ Proxy-Info ]
        				     * [ AVP ]
			*/
			struct dict_object * cmd;
			struct local_rules_definition rules[] = 
						{ 	 {  "Origin-AAA-Protocol",		RULE_OPTIONAL,   -1, 1 }
							,{  "State", 				RULE_OPTIONAL,   -1, 1 }
						};
			
			CHECK_dict_search( DICT_COMMAND, CMD_BY_NAME, "Abort-Session-Answer", &cmd);
			PARSE_loc_rules( rules, cmd );
		}
		
		/* Accounting-Request */
		{
			/*
				Add additional rules of the ABNF (compared to Base definition):

				<AC-Request> ::= < Diameter Header: 271, REQ, PXY >
        				      < Session-Id >
        				      { Origin-Host }
        				      { Origin-Realm }
        				      { Destination-Realm }
        				      { Accounting-Record-Type }
        				      { Accounting-Record-Number }
        				      [ Acct-Application-Id ]
        				      [ Vendor-Specific-Application-Id ]
        				      [ User-Name ]
        				      [ Accounting-Sub-Session-Id ]
        				      [ Acct-Session-Id ]
        				      [ Acct-Multi-Session-Id ]
        				      [ Origin-AAA-Protocol ]
        				      [ Origin-State-Id ]
        				      [ Destination-Host ]
        				      [ Event-Timestamp ]
        				      [ Acct-Delay-Time ]
        				      [ NAS-Identifier ]
        				      [ NAS-IP-Address ]
        				      [ NAS-IPv6-Address ]
        				      [ NAS-Port ]
        				      [ NAS-Port-Id ]
        				      [ NAS-Port-Type ]
        				    * [ Class ]
        				      [ Service-Type ]
        				      [ Termination-Cause ]
        				      [ Accounting-Input-Octets ]
        				      [ Accounting-Input-Packets ]
        				      [ Accounting-Output-Octets ]
        				      [ Accounting-Output-Packets ]
        				      [ Acct-Authentic ]
        				      [ Accounting-Auth-Method ]
        				      [ Acct-Link-Count ]
        				      [ Acct-Session-Time ]
        				      [ Acct-Tunnel-Connection ]
        				      [ Acct-Tunnel-Packets-Lost ]
        				      [ Callback-Id ]
        				      [ Callback-Number ]
        				      [ Called-Station-Id ]
        				      [ Calling-Station-Id ]
        				    * [ Connection-Info ]
        				      [ Originating-Line-Info ]
        				      [ Authorization-Lifetime ]
        				      [ Session-Timeout ]
        				      [ Idle-Timeout ]
        				      [ Port-Limit ]
        				      [ Accounting-Realtime-Required ]
        				      [ Acct-Interim-Interval ]
        				    * [ Filter-Id ]
        				    * [ NAS-Filter-Rule ]
        				    * [ Qos-Filter-Rule ]
        				      [ Framed-AppleTalk-Link ]
        				      [ Framed-AppleTalk-Network ]
        				      [ Framed-AppleTalk-Zone ]
        				      [ Framed-Compression ]
        				      [ Framed-Interface-Id ]
        				      [ Framed-IP-Address ]
        				      [ Framed-IP-Netmask ]
        				    * [ Framed-IPv6-Prefix ]
        				      [ Framed-IPv6-Pool ]
        				    * [ Framed-IPv6-Route ]
        				      [ Framed-IPX-Network ]
        				      [ Framed-MTU ]
        				      [ Framed-Pool ]
        				      [ Framed-Protocol ]
        				    * [ Framed-Route ]
        				      [ Framed-Routing ]
        				    * [ Login-IP-Host ]
        				    * [ Login-IPv6-Host ]
        				      [ Login-LAT-Group ]
        				      [ Login-LAT-Node ]
        				      [ Login-LAT-Port ]
        				      [ Login-LAT-Service ]
        				      [ Login-Service ]
        				      [ Login-TCP-Port ]
        				    * [ Tunneling ]
        				    * [ Proxy-Info ]
        				    * [ Route-Record ]
        				    * [ AVP ]
			*/
			struct dict_object * cmd;
			struct local_rules_definition rules[] = 
						{ 	 {  "Origin-AAA-Protocol",		RULE_OPTIONAL,   -1, 1 }
							,{  "Acct-Delay-Time",			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Identifier",			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-IP-Address",			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-IPv6-Address",			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Port",				RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Port-Id",			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Port-Type",			RULE_OPTIONAL,   -1, 1 }
							,{  "Class",				RULE_OPTIONAL,   -1,-1 }
							,{  "Service-Type",			RULE_OPTIONAL,   -1, 1 }
							,{  "Termination-Cause",		RULE_OPTIONAL,   -1, 1 }
							,{  "Accounting-Input-Octets",		RULE_OPTIONAL,   -1, 1 }
							,{  "Accounting-Input-Packets",		RULE_OPTIONAL,   -1, 1 }
							,{  "Accounting-Output-Octets",		RULE_OPTIONAL,   -1, 1 }
							,{  "Accounting-Output-Packets",	RULE_OPTIONAL,   -1, 1 }
							,{  "Acct-Authentic",			RULE_OPTIONAL,   -1, 1 }
							,{  "Accounting-Auth-Method",		RULE_OPTIONAL,   -1, 1 }
							,{  "Acct-Link-Count",			RULE_OPTIONAL,   -1, 1 }
							,{  "Acct-Session-Time",		RULE_OPTIONAL,   -1, 1 }
							,{  "Acct-Tunnel-Connection",		RULE_OPTIONAL,   -1, 1 }
							,{  "Acct-Tunnel-Packets-Lost",		RULE_OPTIONAL,   -1, 1 }
							,{  "Callback-Id",			RULE_OPTIONAL,   -1, 1 }
							,{  "Callback-Number",			RULE_OPTIONAL,   -1, 1 }
							,{  "Called-Station-Id",		RULE_OPTIONAL,   -1, 1 }
							,{  "Calling-Station-Id",		RULE_OPTIONAL,   -1, 1 }
							,{  "Connect-Info",			RULE_OPTIONAL,   -1,-1 }
							,{  "Originating-Line-Info",		RULE_OPTIONAL,   -1, 1 }
							,{  "Authorization-Lifetime",		RULE_OPTIONAL,   -1, 1 }
							,{  "Session-Timeout",			RULE_OPTIONAL,   -1, 1 }
							,{  "Idle-Timeout",			RULE_OPTIONAL,   -1, 1 }
							,{  "Port-Limit",			RULE_OPTIONAL,   -1, 1 }
							,{  "Filter-Id",			RULE_OPTIONAL,   -1,-1 }
							,{  "NAS-Filter-Rule",			RULE_OPTIONAL,   -1,-1 }
							,{  "QoS-Filter-Rule",			RULE_OPTIONAL,   -1,-1 }
							,{  "Framed-AppleTalk-Link",		RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-AppleTalk-Network",		RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-AppleTalk-Zone",		RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-Compression",		RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-Interface-Id",		RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-IP-Address",		RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-IPv6-Prefix",		RULE_OPTIONAL,   -1,-1 }
							,{  "Framed-IPv6-Pool",			RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-IPv6-Route",		RULE_OPTIONAL,   -1,-1 }
							,{  "Framed-IP-Netmask",		RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-Route",			RULE_OPTIONAL,   -1,-1 }
							,{  "Framed-Pool",			RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-IPX-Network",		RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-MTU",			RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-Protocol",			RULE_OPTIONAL,   -1, 1 }
							,{  "Framed-Routing",			RULE_OPTIONAL,   -1, 1 }
							,{  "Login-IP-Host",			RULE_OPTIONAL,   -1,-1 }
							,{  "Login-IPv6-Host",			RULE_OPTIONAL,   -1,-1 }
							,{  "Login-LAT-Group",			RULE_OPTIONAL,   -1, 1 }
							,{  "Login-LAT-Node",			RULE_OPTIONAL,   -1, 1 }
							,{  "Login-LAT-Port",			RULE_OPTIONAL,   -1, 1 }
							,{  "Login-LAT-Service",		RULE_OPTIONAL,   -1, 1 }
							,{  "Login-Service",			RULE_OPTIONAL,   -1, 1 }
							,{  "Login-TCP-Port",			RULE_OPTIONAL,   -1, 1 }
							,{  "Tunneling",			RULE_OPTIONAL,   -1,-1 }
						};
			
			CHECK_dict_search( DICT_COMMAND, CMD_BY_NAME, "Accounting-Request", &cmd);
			PARSE_loc_rules( rules, cmd );
		}
		
		/* Accounting-Answer */
		{
			/*
				Add additional rules of the ABNF (compared to Base definition):

				<AC-Answer> ::= < Diameter Header: 271, PXY >
        				      < Session-Id >
        				      { Result-Code }
        				      { Origin-Host }
        				      { Origin-Realm }
        				      { Accounting-Record-Type }
        				      { Accounting-Record-Number }
        				      [ Acct-Application-Id ]
        				      [ Vendor-Specific-Application-Id ]
        				      [ User-Name ]
        				      [ Accounting-Sub-Session-Id ]
        				      [ Acct-Session-Id ]
        				      [ Acct-Multi-Session-Id ]
        				      [ Event-Timestamp ]
        				      [ Error-Message ]
        				      [ Error-Reporting-Host ]
        				    * [ Failed-AVP ]
        				      [ Origin-AAA-Protocol ]
        				      [ Origin-State-Id ]
        				      [ NAS-Identifier ]
        				      [ NAS-IP-Address ]
        				      [ NAS-IPv6-Address ]
        				      [ NAS-Port ]
        				      [ NAS-Port-Id ]
        				      [ NAS-Port-Type ]
        				      [ Service-Type ]
        				      [ Termination-Cause ]
        				      [ Accounting-Realtime-Required ]
        				      [ Acct-Interim-Interval ]
        				    * [ Class ]
        				    * [ Proxy-Info ]
        				    * [ Route-Record ]
        				    * [ AVP ]

			*/
			struct dict_object * cmd;
			struct local_rules_definition rules[] = 
						{ 	 {  "Origin-AAA-Protocol",		RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Identifier", 			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-IP-Address", 			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-IPv6-Address", 		RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Port", 			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Port-Id", 			RULE_OPTIONAL,   -1, 1 }
							,{  "NAS-Port-Type", 			RULE_OPTIONAL,   -1, 1 }
							,{  "Service-Type", 			RULE_OPTIONAL,   -1, 1 }
							,{  "Termination-Cause", 		RULE_OPTIONAL,   -1, 1 }
						};
			
			CHECK_dict_search( DICT_COMMAND, CMD_BY_NAME, "Accounting-Answer", &cmd);
			PARSE_loc_rules( rules, cmd );
		}
	}
	
	LOG_D( "Extension 'Dictionary definitions for NASREQ' initialized");
	return 0;
}

EXTENSION_ENTRY("dict_nasreq", dnr_entry);
