eapol/eapol_framework/eapol_common/include/eap_tools.h
changeset 0 c8830336c852
child 2 1c7bc153c08e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eapol/eapol_framework/eapol_common/include/eap_tools.h	Thu Dec 17 08:47:43 2009 +0200
@@ -0,0 +1,611 @@
+/*
+* 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.
+*
+*/
+
+
+
+
+#if !defined( _EAP_TOOLS_H_ )
+#define _EAP_TOOLS_H_
+
+/** @file */
+
+#include "eap_am_compiler_flags.h"
+
+#include "eap_variable_data.h"
+#include "eap_status.h"
+#include "eap_am_export.h"
+
+#if defined(USE_EAP_STACK_TRACE) || defined(USE_EAP_ASSERT_STACK_TRACE)
+	#include "eap_am_stack_trace.h"
+#endif //#if defined(EAP_STACK_TRACE)
+
+
+//----------------------------------------------------------------------------------
+
+/**
+ * This function changes 16-bit unsigned integer from host order to network order.
+ */
+EAP_C_FUNC_IMPORT u16_t eap_htons(const u16_t value);
+
+/**
+ * This function changes 32-bit unsigned integer from host order to network order.
+ */
+EAP_C_FUNC_IMPORT u32_t eap_htonl(const u32_t value);
+
+/**
+ * This function changes 64-bit unsigned integer from host order to network order.
+ */
+EAP_C_FUNC_IMPORT u64_t eap_htonll(const u64_t value);
+
+
+/**
+ * This function changes 16-bit unsigned integer from network order to host order.
+ */
+#define eap_ntohs(addr) eap_htons(addr)
+
+/**
+ * This function changes 32-bit unsigned integer from network order to host order.
+ */
+#define eap_ntohl(addr) eap_htonl(addr)
+
+/**
+ * This function changes 64-bit unsigned integer from network order to host order.
+ */
+#define eap_ntohll(addr) eap_htonll(addr)
+
+
+/**
+ * This function changes 16-bit unsigned integer from host order to little endian order.
+ * This is used in some crypto algorithms.
+ */
+EAP_C_FUNC_IMPORT u16_t eap_host_to_little_endian_short(const u16_t value);
+
+/**
+ * This function changes 32-bit unsigned integer from host order to little endian order.
+ * This is used in some crypto algorithms.
+ */
+EAP_C_FUNC_IMPORT u32_t eap_host_to_little_endian_long(const u32_t value);
+
+/**
+ * This function changes 64-bit unsigned integer from host order to little endian order.
+ * This is used in some crypto algorithms.
+ */
+EAP_C_FUNC_IMPORT u64_t eap_host_to_little_endian_long(const u64_t value);
+
+/**
+ * This function write 16-bit unsigned integer which is in little endian order to memory.
+ */
+EAP_C_FUNC_IMPORT eap_status_e eap_write_u16_t_little_endian_order(
+	void * const p_data,
+	const u32_t data_length,
+	const u16_t value);
+
+/**
+ * This function write 32-bit unsigned integer which is in little endian order to memory.
+ */
+EAP_C_FUNC_IMPORT eap_status_e eap_write_u32_t_little_endian_order(
+	void * const p_data,
+	const u32_t data_length,
+	const u32_t value);
+
+/**
+ * This function write 64-bit unsigned integer which is in little endian order to memory.
+ */
+EAP_C_FUNC_IMPORT eap_status_e eap_write_u64_t_little_endian_order(
+	void * const p_data,
+	const u32_t data_length,
+	const u64_t value);
+
+/**
+ * This function reads 16-bit unsigned integer which is in little endian order from memory
+ * and returns value in host order.
+ */
+EAP_C_FUNC_IMPORT u16_t eap_read_u16_t_little_endian_order(
+	const void * const data,
+	const u32_t data_length);
+
+/**
+ * This function reads 32-bit unsigned integer which is in little endian order from memory
+ * and returns value in host order.
+ */
+EAP_C_FUNC_IMPORT u32_t eap_read_u32_t_little_endian_order(
+	const void * const p_data,
+	const u32_t data_length);
+
+/**
+ * This function reads 64-bit unsigned integer which is in little endian order from memory
+ * and returns value in host order.
+ */
+EAP_C_FUNC_IMPORT u64_t eap_read_u64_t_little_endian_order(
+	const void * const p_data,
+	const u32_t data_length);
+
+/**
+ * This function reads 16-bit unsigned integer which is in network order from memory
+ * and returns value in host order.
+ */
+EAP_C_FUNC_IMPORT u16_t eap_read_u16_t_network_order(
+	const void * const data,
+	const u32_t data_length);
+
+/**
+ * This function reads 24-bit unsigned integer which is in network order from memory
+ * and returns it in 32-bit value in host order.
+ */
+EAP_C_FUNC_IMPORT u32_t eap_read_u24_t_network_order(
+	const void * const data,
+	const u32_t data_length);
+
+/**
+ * This function reads 32-bit unsigned integer which is in network order from memory
+ * and returns value in host order.
+ */
+EAP_C_FUNC_IMPORT u32_t eap_read_u32_t_network_order(
+	const void * const data,
+	const u32_t data_length);
+
+/**
+ * This function reads 64-bit unsigned integer which is in network order from memory
+ * and returns value in host order.
+ */
+EAP_C_FUNC_IMPORT u64_t eap_read_u64_t_network_order(
+	const void * const data,
+	const u32_t data_length);
+
+
+/**
+ * This function writes 16-bit unsigned integer to network order to memory
+ * and returns status eap_status_ok when successfull.
+ */
+EAP_C_FUNC_IMPORT eap_status_e eap_write_u16_t_network_order(
+	void * const data,
+	const u32_t data_length,
+	const u16_t value);
+
+/**
+ * This function writes 24-bit unsigned integer to network order to memory
+ * and returns status eap_status_ok when successfull.
+ * Note only 24-bit least significant bits are written from 32-bit value.
+ */
+EAP_C_FUNC_IMPORT eap_status_e eap_write_u24_t_network_order(
+	void * const data,
+	const u32_t data_length,
+	const u32_t value);
+
+/**
+ * This function writes 32-bit unsigned integer to network order to memory
+ * and returns status eap_status_ok when successfull.
+ */
+EAP_C_FUNC_IMPORT eap_status_e eap_write_u32_t_network_order(
+	void * const data,
+	const u32_t data_length,
+	const u32_t value);
+
+/**
+ * This function writes 64-bit unsigned integer to network order to memory
+ * and returns status eap_status_ok when successfull.
+ */
+EAP_C_FUNC_IMPORT eap_status_e eap_write_u64_t_network_order(
+	void * const data,
+	const u32_t data_length,
+	const u64_t value);
+
+
+
+EAP_C_FUNC_IMPORT u64_t eap_shift_left_64_bit(u64_t value, u32_t shift);
+
+EAP_C_FUNC_IMPORT u64_t eap_shift_right_64_bit(u64_t value, u32_t shift);
+
+
+inline u64_t eap_read_u64_t_host_order(
+	const void * const p_data,
+	const u32_t data_length)
+{
+	#if defined(EAP_LITTLE_ENDIAN) /// byte 0 is least significant (i386)
+		return eap_read_u64_t_little_endian_order(
+			p_data,
+			data_length);
+	#elif defined(EAP_BIG_ENDIAN) /// byte 0 is most significant (mc68k)
+		return eap_read_u64_t_network_order(
+			p_data,
+			data_length);
+	#else
+		#error ERROR: define EAP_LITTLE_ENDIAN (byte 0 is least significant (i386)) \
+				or EAP_BIG_ENDIAN (byte 0 is most significant (mc68k)).
+	#endif
+}
+
+
+inline eap_status_e eap_write_u64_t_host_order(
+	void * const data,
+	const u32_t data_length,
+	const u64_t value)
+{
+	#if defined(EAP_LITTLE_ENDIAN) /// byte 0 is least significant (i386)
+		return eap_write_u64_t_little_endian_order(
+			data,
+			data_length,
+			value);
+	#elif defined(EAP_BIG_ENDIAN) /// byte 0 is most significant (mc68k)
+		return eap_write_u64_t_network_order(
+			data,
+			data_length,
+			value);
+	#else
+		#error ERROR: define EAP_LITTLE_ENDIAN (byte 0 is least significant (i386)) \
+				or EAP_BIG_ENDIAN (byte 0 is most significant (mc68k)).
+	#endif
+}
+
+//----------------------------------------------------------------------------------
+
+#if defined(__SYMBIAN32__)
+	/// This is name of default file for EAP Core traces.
+	const eap_const_string EAP_DEFAULT_TRACE_FILE = EAPL("c:\\logs\\eapol\\eap_core.log");
+	#define __PRETTY_FUNCTION__ "function()"
+#elif defined(__GNUC__) || defined(__arm)
+	/// This is name of default file for EAP Core traces.
+	const char * const EAP_DEFAULT_TRACE_FILE = "/tmp/eap_core.log";
+#elif defined(_WIN32) && !defined(__GNUC__)
+	#define __PRETTY_FUNCTION__ "function()"
+	/// This is name of default file for EAP Core traces.
+	const char * const EAP_DEFAULT_TRACE_FILE = "c:\\temp\\eap_core.log";
+#endif
+
+
+#define EAP_NULL_FUNCTION  /* do{}while(0) // This causes a lot of warning C4127: conditional expression is constant. */
+
+
+#if defined(NO_EAP_TRACE)
+#error Use of NO_EAP_TRACE is deprecated. Please, define USE_EAP_TRACE when EAP traces are needed.
+#endif //defined(NO_EAP_TRACE)
+
+#if defined(NO_EAP_DEBUG_TRACE)
+#error Use of NO_EAP_DEBUG_TRACE is deprecated. Please, define USE_EAP_DEBUG_TRACE when EAP debug traces are needed.
+#endif //defined(NO_EAP_DEBUG_TRACE)
+
+#if defined(NO_EAP_TRACE_STRINGS)
+#error Use of NO_EAP_TRACE_STRINGS is deprecated. Please, define USE_EAP_TRACE_STRINGS when EAP debug trace strings are needed.
+#endif //defined(NO_EAP_TRACE_STRINGS)
+
+#if defined(NO_EAP_ASSERTS)
+#error Use of NO_EAP_ASSERTS is deprecated. Please, define USE_EAP_ASSERTS when EAP assertions are needed.
+#endif //!defined(USE_EAP_ASSERTS)
+
+#if defined(NO_EAP_STATUS_RETURN)
+#error Use of NO_EAP_STATUS_RETURN is deprecated. Please, define USE_EAP_STATUS_RETURN when EAP status return traces are needed.
+#endif //!defined(NO_EAP_STATUS_RETURN)
+
+#if defined(NO_EAP_FUNCTION_TRACE)
+#error Use of NO_EAP_FUNCTION_TRACE is deprecated. Please, define USE_EAP_FUNCTION_TRACE when heavy EAP function traces are needed.
+#endif //!defined(NO_EAP_FUNCTION_TRACE)
+
+
+#if !defined(USE_EAP_TRACE_ALWAYS) && !defined(USE_EAP_TRACE)
+
+	#define EAP_TRACE_ALWAYS(object_name, flags, _parameter_list_) EAP_NULL_FUNCTION
+
+	#define EAP_TRACE_DATA_ALWAYS(object_name, flags, _parameter_list_) EAP_NULL_FUNCTION
+
+#else
+
+	/**
+	 * This function traces formatted string with parameters to a file.
+	 * For example
+	 * @code
+	 * EAP_TRACE_ALWAYS(m_am_tools, TRACE_FLAGS_TIMER, (EAPL("~eap_type_gsmsim_c(): 0x%08x\n"), this));
+	 * @endcode
+	 *
+	 */
+	#define EAP_TRACE_ALWAYS(object_name, flags, _parameter_list_) \
+			if (object_name != 0 && ((*(object_name)).get_trace_mask() & (flags))) \
+			{ \
+				(*(object_name)).formatted_print _parameter_list_ ; \
+			} \
+
+	/**
+	 * This function traces data bytes to a file.
+	 * For example
+	 * @code
+	 * EAP_TRACE_DATA_ALWAYS(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("new_nai"),
+	 *	new_nai->get_data(new_nai->get_data_length()),
+	 *	new_nai->get_data_length()));".
+	 * @endcode
+	 *
+	 */
+	#define EAP_TRACE_DATA_ALWAYS(object_name, flags, _parameter_list_) \
+			if (object_name != 0 && ((*(object_name)).get_trace_mask() & (flags))) \
+			{ \
+				(*(object_name)).trace_data _parameter_list_ ; \
+			} \
+
+#endif //#if !defined(USE_EAP_TRACE_ALWAYS)
+
+
+#if !defined(USE_EAP_TRACE)
+
+	#define EAP_TRACE_ERROR(object_name, flags, _parameter_list_) EAP_NULL_FUNCTION
+
+	#define EAP_TRACE_DEBUG(object_name, flags, _parameter_list_) EAP_NULL_FUNCTION
+
+	#define EAP_TRACE_FORMAT(object_name, _parameter_list_) EAP_NULL_FUNCTION
+
+	#define EAP_TRACE_RETURN_STRING(object_name, string) EAP_NULL_FUNCTION
+
+	#define EAP_TRACE_DATA_ERROR(object_name, flags, _parameter_list_) EAP_NULL_FUNCTION
+
+	#define EAP_TRACE_DATA_DEBUG(object_name, flags, _parameter_list_) EAP_NULL_FUNCTION
+
+	#define EAP_TRACE_BEGIN(object_name, flags) EAP_NULL_FUNCTION
+
+	#define EAP_TRACE_END(object_name, flags) EAP_NULL_FUNCTION
+
+#else
+
+	/**
+	 * This function traces formatted string with parameters to a file.
+	 * Trace includes ERROR string, file name and line number.
+	 * For example
+	 * @code
+	 * EAP_TRACE_ERROR(m_am_tools, TRACE_FLAGS_TIMER, (EAPL("~eap_type_gsmsim_c(): 0x%08x\n"), this));
+	 * @endcode
+	 *
+	 */
+	#define EAP_TRACE_ERROR(object_name, flags, _parameter_list_) \
+		if (object_name != 0) \
+		{ \
+			(*(object_name)).check_activate_trace_on_error(); \
+			if (((*(object_name)).get_trace_mask() & ((flags) | eap_am_tools_c::eap_trace_mask_error))) \
+			{ \
+				(*(object_name)).formatted_print(EAPL("ERROR: source: %s:%d\n"), __FILE__, __LINE__); \
+				(*(object_name)).formatted_print _parameter_list_ ; \
+			} \
+		} \
+
+	/**
+	 * This function traces data bytes to a file.
+	 * For example
+	 * @code
+	 * EAP_TRACE_DATA_ERROR(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("new_nai"),
+	 *	new_nai->get_data(new_nai->get_data_length()),
+	 *	new_nai->get_data_length()));".
+	 * @endcode
+	 *
+	 */
+	#define EAP_TRACE_DATA_ERROR(object_name, flags, _parameter_list_) \
+		if (object_name != 0) \
+		{ \
+			(*(object_name)).check_activate_trace_on_error(); \
+			if (((*(object_name)).get_trace_mask() & ((flags) | eap_am_tools_c::eap_trace_mask_error))) \
+			{ \
+				(*(object_name)).trace_data _parameter_list_ ; \
+			} \
+		} \
+
+	/**
+	 * @{ Remove debug traces in release version when appropriate. }
+	 */
+	//#if defined(_DEBUG) && defined(USE_EAP_DEBUG_TRACE)
+	#if defined(USE_EAP_DEBUG_TRACE)
+
+		/**
+		 * This function traces formatted string with parameters to a file.
+		 * This is used only in debug version.
+		 * For example
+		 * @code
+		 * EAP_TRACE_DEBUG(m_am_tools, TRACE_FLAGS_TIMER, (EAPL("~eap_type_gsmsim_c(): 0x%08x\n"), this));
+		 * @endcode
+		 *
+		 */
+		#define EAP_TRACE_DEBUG(object_name, flags, _parameter_list_) \
+				if (object_name != 0 && ((*(object_name)).get_trace_mask() & ((flags) | eap_am_tools_c::eap_trace_mask_error))) \
+				{ \
+					if (((*(object_name)).get_trace_mask() & ((flags) & eap_am_tools_c::eap_trace_mask_error))) \
+					{ \
+						(*(object_name)).formatted_print(EAPL("ERROR: source: %s:%d\n"), __FILE__, __LINE__); \
+						(*(object_name)).formatted_print _parameter_list_ ; \
+					} \
+					else if (((*(object_name)).get_trace_mask() & (flags))) \
+					{ \
+						(*(object_name)).formatted_print _parameter_list_ ; \
+					} \
+					else \
+					{ \
+						/* Do nothing. This else is because lint complains the missing else. */ \
+					} \
+				} \
+
+		/**
+		 * This function traces data bytes to a file.
+		 * This is used only in debug version.
+		 * For example
+		 * @code
+		 * EAP_TRACE_DATA_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("new_nai"),
+		 *	new_nai->get_data(new_nai->get_data_length()),
+		 *	new_nai->get_data_length()));".
+		 * @endcode
+		 *
+		 */
+		#define EAP_TRACE_DATA_DEBUG(object_name, flags, _parameter_list_) \
+				if (object_name != 0 && ((*(object_name)).get_trace_mask() & (flags))) \
+				{ \
+					(*(object_name)).trace_data _parameter_list_ ; \
+				} \
+
+		/**
+		 * This function formats string to a buffer.
+		 * This is used only in debug version.
+		 * For example
+		 * @code
+		 * EAP_TRACE_FORMAT(m_am_tools, (buffer, buffer_size, EAPL("new_nai %d, %s"),
+		 *	foo,
+		 *	EAPL("some string")));".
+		 * @endcode
+		 *
+		 */
+		#define EAP_TRACE_FORMAT(object_name, _parameter_list_) \
+				if (object_name != 0 && (*(object_name)).get_trace_mask()) \
+				{ \
+					(*(object_name)).snprintf _parameter_list_; \
+				} \
+
+		#define EAP_TRACE_RETURN_STRING(object_name, string) \
+			eap_automatic_trace_string_c __eap_trace_function_returns__(object_name, string);
+
+		/**
+		 * This flag indicates that the debug traces are active.
+		 * Functions can use this flag to deduce whether debug related
+		 * parameters should be introduced.
+		 */
+		#define	EAP_DEBUG_TRACE_ACTIVE
+
+	#else
+
+		#define EAP_TRACE_DEBUG(object_name, flags, _parameter_list_) EAP_NULL_FUNCTION
+
+		#define EAP_TRACE_DATA_DEBUG(object_name, flags, _parameter_list_) EAP_NULL_FUNCTION
+
+		#define EAP_TRACE_FORMAT(object_name, _parameter_list_) EAP_NULL_FUNCTION
+
+		#define EAP_TRACE_RETURN_STRING(object_name, string) EAP_NULL_FUNCTION
+
+	#endif
+
+
+	#if !defined(USE_EAP_FUNCTION_TRACE)
+
+		#define EAP_TRACE_BEGIN(object_name, flags) EAP_NULL_FUNCTION
+
+		#define EAP_TRACE_END(object_name, flags) EAP_NULL_FUNCTION
+
+	#else
+		/**
+		 * This function traces begin of the function with name, file and line number to a file.
+		 * For example
+		 * @code
+		 * EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+		 * @endcode
+		 *
+		 */
+		#define EAP_TRACE_BEGIN(object_name, flags) \
+				if (object_name != 0 && ((*(object_name)).get_trace_mask() & (eap_am_tools_c::eap_trace_mask_functions))) \
+				{ \
+					(*(object_name)).formatted_print(EAPL("-> %s:%s:%d\n"), __PRETTY_FUNCTION__, __FILE__, __LINE__); \
+				} \
+
+		/**
+		 * This function traces end of the function with name, file and line number to a file.
+		 * For example
+		 * @code
+		 * EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+		 * @endcode
+		 *
+		 */
+		#define EAP_TRACE_END(object_name, flags) \
+				if (object_name != 0 && ((*(object_name)).get_trace_mask() & (eap_am_tools_c::eap_trace_mask_functions))) \
+				{ \
+					(*(object_name)).formatted_print(EAPL("<- %s:%s:%d\n"), __PRETTY_FUNCTION__, __FILE__, __LINE__); \
+				} \
+
+	#endif
+
+#endif //#if !defined(USE_EAP_TRACE)
+
+
+
+#if defined(USE_EAP_STACK_TRACE)
+
+		#define EAP_STACK_TRACE_TOOLS(am_tools, address) \
+				{ \
+					stack_trace st_trace(am_tools); \
+					st_trace.trace(address); \
+				} \
+
+		#define EAP_STACK_TRACE(address) \
+			EAP_STACK_TRACE_TOOLS(m_am_tools, address)
+
+#else
+
+		#define EAP_STACK_TRACE_TOOLS(am_tools, address) EAP_NULL_FUNCTION
+
+		#define EAP_STACK_TRACE(address) EAP_NULL_FUNCTION
+
+#endif //#if defined(EAP_STACK_TRACE)
+
+
+#if defined(USE_EAP_ASSERT_STACK_TRACE)
+
+		#define EAP_ASSERT_STACK_TRACE_TOOLS(am_tools, address) \
+				{ \
+					stack_trace st_trace(am_tools); \
+					st_trace.trace(address); \
+				} \
+
+		#define EAP_ASSERT_STACK_TRACE(address) \
+			EAP_ASSERT_STACK_TRACE_TOOLS(m_am_tools, address)
+
+#else
+
+		#define EAP_ASSERT_STACK_TRACE_TOOLS(am_tools, address) EAP_NULL_FUNCTION
+
+		#define EAP_ASSERT_STACK_TRACE(address) EAP_NULL_FUNCTION
+
+#endif //#if defined(EAP_STACK_TRACE)
+
+
+
+/// This defines one if case for a constant
+/// that returns constant name string.
+#define EAP_IF_RETURN_STRING(type, const_type) \
+		if ((type) == (const_type)) \
+		{ \
+			return EAPL(#const_type); \
+		}
+
+
+#if !defined(lint)
+	#if defined(__GNUC__) || defined(__ARMCC__) || defined(__arm)
+		/// This prevent compiler warning of unused variable.
+		#define EAP_UNREFERENCED_PARAMETER(P) \
+				if ((&(P)) == (&(P))) \
+					; \
+
+	#else
+		/// This prevent compiler warning of unused variable.
+		#define EAP_UNREFERENCED_PARAMETER(P) (P)
+	#endif
+#else // lint
+	// Note: lint -e530 says don't complain about uninitialized variables for
+	// this varible.  Error 527 has to do with unreachable code.
+	// -restore restores checking to the -save state
+	/// This prevent compiler warning of unused variable.
+	#define EAP_UNREFERENCED_PARAMETER(P)          \
+		/*lint -save -e527 -e530 */ \
+		{\
+				(P) = (P); \
+		} \
+
+		/*lint -restore */
+#endif // lint
+
+//----------------------------------------------------------------------------------
+
+#endif //#if !defined( _EAP_TOOLS_H_ )
+
+
+
+// End.