/*
* Copyright (c) 2001-2006 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  EAP and WLAN authentication protocols.
*
*/

/*
* %version: 10 %
*/

#if !defined(_EAP_DIAMETER_AVP_CODE_H_)
#define _EAP_DIAMETER_AVP_CODE_H_


#include "eap_am_assert.h"
#include "eap_am_tools.h"
#include "eap_tools.h"


/** @file */

/**
 * Enumeration of the DIAMETER APV codes of IETF.
 * These are defined in IANA, "RADIUS Types",
 * http://www.iana.org/assignments/radius-types.
 */
enum eap_diameter_avp_code_of_ietf_e
{
	eap_diameter_avp_code_none = 0,
	eap_diameter_avp_code_user_name = 1,
	eap_diameter_avp_code_user_password = 2,
	eap_diameter_avp_code_chap_password = 3,
	eap_diameter_avp_code_nas_ip_address = 4,
	eap_diameter_avp_code_nas_port = 5,
	eap_diameter_avp_code_service_type = 6,
	eap_diameter_avp_code_framed_protocol = 7,
	eap_diameter_avp_code_framed_ip_address = 8,
	eap_diameter_avp_code_framed_ip_netmask = 9,
	eap_diameter_avp_code_framed_routing = 10,
	eap_diameter_avp_code_filter_id = 11,
	eap_diameter_avp_code_framed_mtu = 12,
	eap_diameter_avp_code_framed_compression = 13,
	eap_diameter_avp_code_login_ip_host = 14,
	eap_diameter_avp_code_login_service = 15,
	eap_diameter_avp_code_login_tcp_port = 16,
	eap_diameter_avp_code_reply_message = 18,
	eap_diameter_avp_code_callback_number = 19,
	eap_diameter_avp_code_callback_id = 20,
	eap_diameter_avp_code_framed_route = 22,
	eap_diameter_avp_code_framed_ipx_network = 23,
	eap_diameter_avp_code_state = 24,
	eap_diameter_avp_code_class = 25,
	eap_diameter_avp_code_vendor_specific = 26,
	eap_diameter_avp_code_session_timeout = 27,
	eap_diameter_avp_code_idle_timeout = 28,
	eap_diameter_avp_code_termination_action = 29,
	eap_diameter_avp_code_called_station_id = 30,
	eap_diameter_avp_code_calling_station_id = 31,
	eap_diameter_avp_code_nas_identifier = 32,
	eap_diameter_avp_code_proxy_state = 33,
	eap_diameter_avp_code_login_lat_service = 34,
	eap_diameter_avp_code_login_lat_node = 35,
	eap_diameter_avp_code_login_lat_group = 36,
	eap_diameter_avp_code_framed_appletalk_link = 37,
	eap_diameter_avp_code_framed_appletalk_network = 38,
	eap_diameter_avp_code_framed_appletalk_zone = 39,
	eap_diameter_avp_code_chap_challenge = 60,
	eap_diameter_avp_code_nas_port_type = 61,
	eap_diameter_avp_code_port_limit = 62,
	eap_diameter_avp_code_login_lat_port = 63,
	eap_diameter_avp_code_eap_message = 79,
	eap_diameter_avp_code_message_authenticator = 80,
};


/**
 * These values are defined in "ASSIGNED NUMBERS", RFC 1700.
 */
enum eap_diameter_vendor_id_e
{
	eap_diameter_vendor_id_of_ietf      =   0,
	eap_diameter_vendor_id_of_microsoft = 311,
};


/**
 * These are defined in "Microsoft Vendor-specific RADIUS Attributes", RFC 2548.
 */
enum eap_diameter_vendor_codes_of_microsoft_e
{
	eap_diameter_vendor_code_of_microsoft_ms_chap_error_value = 2,
	eap_diameter_vendor_code_of_microsoft_ms_chap_nt_enc_pw_value = 6,
	eap_diameter_vendor_code_of_microsoft_ms_chap_challenge_value = 11,
	eap_diameter_vendor_code_of_microsoft_ms_mppe_send_key_value = 16,
	eap_diameter_vendor_code_of_microsoft_ms_mppe_recv_key_value = 17,
	eap_diameter_vendor_code_of_microsoft_ms_chap2_response_value = 25,
	eap_diameter_vendor_code_of_microsoft_ms_chap2_success_value = 26,
	eap_diameter_vendor_code_of_microsoft_ms_chap2_cpw_value = 27,
};

//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------

class EAP_EXPORT eap_diameter_avp_code_c
{

public:

	EAP_FUNC_IMPORT ~eap_diameter_avp_code_c();

	EAP_FUNC_IMPORT eap_diameter_avp_code_c();

	EAP_FUNC_IMPORT eap_diameter_avp_code_c(
		const eap_diameter_vendor_id_e vendor_id,
		const u32_t vendor_code);

	EAP_FUNC_IMPORT eap_diameter_avp_code_c(
		const eap_diameter_avp_code_of_ietf_e ietf_code);


	EAP_FUNC_IMPORT static bool is_ietf_code(const eap_diameter_avp_code_c code);


	EAP_FUNC_IMPORT eap_status_e get_code_data(
		abs_eap_am_tools_c * const am_tools,
		eap_diameter_avp_code_of_ietf_e * const code);

	EAP_FUNC_IMPORT eap_status_e get_code_data(
		abs_eap_am_tools_c * const am_tools,
		eap_diameter_avp_code_c * const code);


	EAP_FUNC_IMPORT void set_code_values(
		const eap_diameter_vendor_id_e vendor_id,
		const u32_t vendor_code);

	EAP_FUNC_IMPORT eap_diameter_vendor_id_e get_vendor_id() const;

	EAP_FUNC_IMPORT u32_t get_vendor_code() const;


	EAP_FUNC_IMPORT bool operator == (const eap_diameter_avp_code_of_ietf_e right_type_value) const;

	EAP_FUNC_IMPORT bool operator != (const eap_diameter_avp_code_of_ietf_e right_type_value) const;

	EAP_FUNC_IMPORT bool operator == (const eap_diameter_avp_code_c &right_type_value) const;

	EAP_FUNC_IMPORT bool operator != (const eap_diameter_avp_code_c &right_type_value) const;


	EAP_FUNC_IMPORT eap_diameter_avp_code_c &operator = (const eap_diameter_avp_code_of_ietf_e right_type_value);

	EAP_FUNC_IMPORT eap_diameter_avp_code_c &operator = (const eap_diameter_avp_code_c &right_type_value);

	EAP_FUNC_IMPORT eap_diameter_avp_code_c *operator & ();


	EAP_FUNC_IMPORT const eap_diameter_avp_code_c *operator & () const;


private:

	eap_diameter_vendor_id_e   m_vendor_id;
	u32_t                      m_vendor_code;
};

//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------

class EAP_EXPORT eap_static_diameter_vendor_code_c
{
public:

	EAP_FUNC_IMPORT const eap_diameter_avp_code_c & get_code() const;

public:

	eap_diameter_vendor_id_e   m_vendor_id;
	u32_t                      m_vendor_code;
};

#define EAP_DIAMETER_VENDOR_CODE(name, vendor_id, vendor_code) \
	static const eap_static_diameter_vendor_code_c name={vendor_id, vendor_code}

//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------

EAP_C_FUNC_IMPORT u32_t convert_eap_diameter_avp_code_to_u32_t(eap_diameter_avp_code_c code);

EAP_C_FUNC_IMPORT u64_t convert_eap_diameter_avp_code_to_u64_t(eap_diameter_avp_code_c code);

//-----------------------------------------------------------------------------------------

#if defined(EAP_USE_TTLS_PLAIN_MS_CHAP_V2_HACK)

// EAP Diameter Vendor Codes.

/**
 * This is defined in "Microsoft Vendor-specific RADIUS Attributes", RFC 2548.
 * Reference name is MS-CHAP-Error.
 */
EAP_DIAMETER_VENDOR_CODE(
	eap_diameter_vendor_code_of_microsoft_ms_chap_error,
	eap_diameter_vendor_id_of_microsoft,
	eap_diameter_vendor_code_of_microsoft_ms_chap_error_value);

/**
 * This is defined in "Microsoft Vendor-specific RADIUS Attributes", RFC 2548.
 * Reference name is MS-CHAP-NT-Enc-PW.
 */
EAP_DIAMETER_VENDOR_CODE(
	eap_diameter_vendor_code_of_microsoft_ms_chap_nt_enc_pw,
	eap_diameter_vendor_id_of_microsoft,
	eap_diameter_vendor_code_of_microsoft_ms_chap_nt_enc_pw_value);

/**
 * This is defined in "Microsoft Vendor-specific RADIUS Attributes", RFC 2548.
 * Reference name is MS-CHAP-Challenge.
 */
EAP_DIAMETER_VENDOR_CODE(
	eap_diameter_vendor_code_of_microsoft_ms_chap_challenge,
	eap_diameter_vendor_id_of_microsoft,
	eap_diameter_vendor_code_of_microsoft_ms_chap_challenge_value);


EAP_DIAMETER_VENDOR_CODE(
	eap_diameter_vendor_code_of_microsoft_ms_mppe_send_key,
	eap_diameter_vendor_id_of_microsoft,
	eap_diameter_vendor_code_of_microsoft_ms_mppe_send_key_value);

EAP_DIAMETER_VENDOR_CODE(
	eap_diameter_vendor_code_of_microsoft_ms_mppe_recv_key,
	eap_diameter_vendor_id_of_microsoft,
	eap_diameter_vendor_code_of_microsoft_ms_mppe_recv_key_value);


/**
 * This is defined in "Microsoft Vendor-specific RADIUS Attributes", RFC 2548.
 * Reference name is MS-CHAP2-Response.
 */
EAP_DIAMETER_VENDOR_CODE(
	eap_diameter_vendor_code_of_microsoft_ms_chap2_response,
	eap_diameter_vendor_id_of_microsoft,
	eap_diameter_vendor_code_of_microsoft_ms_chap2_response_value);

/**
 * This is defined in "Microsoft Vendor-specific RADIUS Attributes", RFC 2548.
 * Reference name is MS-CHAP2-Success.
 */
EAP_DIAMETER_VENDOR_CODE(
	eap_diameter_vendor_code_of_microsoft_ms_chap2_success,
	eap_diameter_vendor_id_of_microsoft,
	eap_diameter_vendor_code_of_microsoft_ms_chap2_success_value);

/**
 * This is defined in "Microsoft Vendor-specific RADIUS Attributes", RFC 2548.
 * Reference name is MS-CHAP2-CPW.
 */
EAP_DIAMETER_VENDOR_CODE(
	eap_diameter_vendor_code_of_microsoft_ms_chap2_cpw,
	eap_diameter_vendor_id_of_microsoft,
	eap_diameter_vendor_code_of_microsoft_ms_chap2_cpw_value);

#endif //#if defined(EAP_USE_TTLS_PLAIN_MS_CHAP_V2_HACK)

//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------

#endif //#if !defined(_EAP_DIAMETER_AVP_CODE_H_)



// End.
