eapol/eapol_framework/eapol_common/include/eap_buffer.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_buffer.h	Thu Dec 17 08:47:43 2009 +0200
@@ -0,0 +1,692 @@
+/*
+* 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_BUFFER_H_)
+#define _EAP_BUFFER_H_
+
+#include "eap_am_assert.h"
+#include "eap_variable_data.h"
+
+//--------------------------------------------------
+
+const u32_t EAP_MAX_LOCAL_PACKET_BUFFER_LENGTH = 1514;
+
+const u8_t EAP_MEM_GUARD_BYTE = 0x55;
+
+#if defined(_DEBUG) && defined(USE_EAP_MEM_GUARD)
+
+	const u32_t EAP_MEM_GUARD_LENGTH = 256u;
+
+	#define EAP_MEM_GUARDS(buffer_size) \
+		(EAP_MEM_GUARD_LENGTH+(buffer_size)+EAP_MEM_GUARD_LENGTH)
+
+#else
+
+	const u32_t EAP_MEM_GUARD_LENGTH = 0u;
+
+	#define EAP_MEM_GUARDS(buffer_size) (buffer_size)
+
+#endif //#if defined(_DEBUG) && defined(USE_EAP_MEM_GUARD)
+
+
+
+enum eap_write_buffer_e
+{
+	eap_write_buffer
+};
+
+
+enum eap_read_buffer_e
+{
+	eap_read_buffer
+};
+
+enum eap_random_error_type
+{
+	eap_random_error_type_manipulate_byte = 0,
+	eap_random_error_type_change_packet_length_longer,
+	eap_random_error_type_change_packet_length_shorter,
+	eap_random_error_type_none_keep_this_last_case,
+};
+
+//--------------------------------------------------
+
+class abs_eap_am_tools_c;
+class eapol_ethernet_header_wr_c;
+class eapol_ethernet_header_rd_c;
+
+
+/// Network packets are handled through eap_buf_chain_base_c class.
+class EAP_EXPORT eap_buf_chain_base_c
+{
+private:
+	//--------------------------------------------------
+
+	/// This is pointer to the tools class.
+	abs_eap_am_tools_c * const m_am_tools;
+
+	/// This struct decreases the memory print of eap_buf_chain_base_c.
+	struct eap_buf_chain_base_impl_str
+	{
+		/// This is the count of guard bytes allocated before and after the buffer.
+		u32_t m_mem_guard_length;
+
+		eap_variable_data_c * m_buffer;
+
+		/// This is pointer to the next buffer. NOTE this is NOT used in current version.
+		eap_buf_chain_base_c *m_next_buffer;
+
+		/// This is used to test protocol with manipulated packets. This is used in testing.
+		eap_random_error_type m_random_error_type;
+
+		/// This is used to test protocol with manipulated packets. This is used in testing.
+		u32_t m_send_packet_index;
+
+		/// This the pointer of sender stack.
+		/// This is used in testing.
+		const void *m_stack_address;
+
+		/// This indicates the buffer is initialized.
+		bool m_is_valid;
+
+		/// This is used to mark packet if it is manipulated. This is used in testing.
+		bool m_is_manipulated;
+
+		/// When this parameter is true eap_core_c activates re-transmission of this packet.
+		/// When this parameter is false eap_core_c does not activate re-transmission of this packet.
+		bool m_do_packet_retransmission;
+
+		/// This is tells whether the sender is client or server.
+		/// This is used in testing.
+		bool m_is_client;
+
+		/// This is used in testing.
+		bool m_do_length_checks;
+
+		/// This flag tells whether this packet must be encrypted (true) or not (false).
+		/// Encryption means the WLAN data encryption on the air (WEP, TKIP or CCMP).
+		/// Using this flag to tell the encryption allows the configuration of the
+		/// temporal key beforehand the key is used.
+		/// This is optimization to fasten the key configuration.
+		bool m_encrypt;
+	};
+
+	/// This is pointer to data of eap_buf_chain_base_c.
+	/// This decreases memory print of eap_buf_chain_base_c.
+	/// This decreases stack usage of EAP_Core.
+	eap_buf_chain_base_impl_str *  m_data;
+
+	//--------------------------------------------------
+
+	/**
+	 * This function initializes the eap_buf_chain_base_c object.
+	 */
+	EAP_FUNC_IMPORT eap_status_e initialize(
+		const u32_t mem_guard_length);
+
+	/**
+	 * Forses the inheritance.
+	 */
+	EAP_FUNC_IMPORT virtual void force_inheritance() = 0;
+
+	/**
+	 * Function checks the memory guard bytes.
+	 */
+	EAP_FUNC_IMPORT bool check_guard_bytes(const u8_t * const guard) const;
+
+	/**
+	 * Function sets the memory guard bytes.
+	 */
+	EAP_FUNC_IMPORT void set_mem_guard_bytes();
+
+	/**
+	 * Function zeroes the data buffer.
+	 */
+	EAP_FUNC_IMPORT void reset_data_buffer();
+
+	//--------------------------------------------------
+protected:
+	//--------------------------------------------------
+
+	/**
+	 * @return Returns pointer to the tools object.
+	 */
+	EAP_FUNC_IMPORT abs_eap_am_tools_c * get_am_tools();
+
+	//--------------------------------------------------
+public:
+	//--------------------------------------------------
+
+	/**
+	 * Function checks the all memory guard bytes.
+	 */
+	EAP_FUNC_IMPORT bool check_guards() const;
+
+	/**
+	 * The destructor of the eap_buf_chain_base_c class checks memory guards
+	 * and frees the allocated buffer.
+	 */
+	EAP_FUNC_IMPORT virtual ~eap_buf_chain_base_c();
+
+	/**
+	 * The constructor of the eap_buf_chain_wr class initializes attributes using
+	 * the parameters passes to it.
+	 * @param eap_write_buffer_e separates the write and read-only constructors.
+	 * @param tools parameter is pointer to the tools class.
+	 * @param data is pointer to the buffer containing the message. 
+	 * @param data_length parameter is count of bytes in the buffer.
+	 * @param reset_data parameter indicates whether the data bytes must be set zero.
+	 * @param free_buffer parameter indicates whether the destructor must free the data buffer.
+	 * @param mem_guard_length indicates the length of guard bytes both pre-fix and post-fix.
+	 *
+	 * NOTE the buffer allocated from the stack or from the heap must allocate additional
+	 * bytes for memory guards. The EAP_MEM_GUARDS(size) macro increases the size with count 
+	 * of memory guard bytes. The example use of eap_buf_chain_wr is as follows.
+	 * NOTE all sanity checks are ignored in the example.
+	 *
+	 * @code
+	 * u8_t packet_buffer[EAP_MEM_GUARDS(EAP_MAX_LOCAL_PACKET_BUFFER_LENGTH)];
+	 * eap_buf_chain_wr_c response_packet(
+	 *     eap_write_buffer, m_am_tools, packet_buffer,
+	 *     sizeof(packet_buffer), true, false, EAP_MEM_GUARD_LENGTH);
+	 * const u32_t eap_header_offset = get_type_partner()->get_header_offset(
+	 *     &MTU, &trailer_length);
+	 * eap_header_wr_c * const eap_response = (eap_header_wr_c * const)
+	 *     response_packet.get_data_offset(eap_header_offset,
+	 *         (EAP_MAX_LOCAL_PACKET_BUFFER_LENGTH
+	 *         -(eap_header_offset+ trailer_length)));
+	 * @endcode
+	 */
+	EAP_FUNC_IMPORT eap_buf_chain_base_c(
+		const eap_write_buffer_e, 
+		abs_eap_am_tools_c * const tools,
+		u8_t * const data, 
+		const u32_t data_length, 
+		const bool reset_data,
+		const bool free_buffer, 
+		const u32_t mem_guard_length);
+
+	/**
+	 * The constructor of the eap_buf_chain_wr class initializes attributes using
+	 * the parameters passes to it.
+	 * @param eap_read_buffer_e separates the write and read-only constructors.
+	 * @param tools parameter is pointer to the tools class.
+	 * @param data is pointer to the buffer containing the message. 
+	 * @param data_length parameter is count of bytes in the buffer.
+	 * @param free_buffer parameter indicates whether the destructor must free the data buffer.
+	 *
+	 * The example use of eap_buf_chain_wr is as follows.
+	 * NOTE all sanity checks are ignored in the example.
+	 *
+	 * @code
+	 * u8_t packet_buffer[EAP_MEM_GUARDS(EAP_MAX_LOCAL_PACKET_BUFFER_LENGTH)];
+	 * eap_buf_chain_rd_c response_packet(
+	 *     eap_read_buffer, m_am_tools, packet_buffer,
+	 *     sizeof(packet_buffer), false);
+	 * const u32_t eap_header_offset = get_type_partner()->get_header_offset(
+	 *     &MTU, &trailer_length);
+	 * eap_header_rd_c * const eap_response = (eap_header_rd_c * const)
+	 *     response_packet.get_data_offset(eap_header_offset,
+	 *         (EAP_MAX_LOCAL_PACKET_BUFFER_LENGTH
+	 *         -(eap_header_offset+ trailer_length)));
+	 * @endcode
+	 */
+	EAP_FUNC_IMPORT eap_buf_chain_base_c(
+		const eap_read_buffer_e,
+		abs_eap_am_tools_c * const tools,
+		const u8_t * const data, 
+		const u32_t data_length,
+		const bool free_buffer);
+
+	/**
+	 * The constructor of the eap_buf_chain_wr class initializes attributes using
+	 * the parameters passes to it.
+	 * New buffer is allocated from heap.
+	 * @param eap_write_buffer_e separates the write and read-only constructors.
+	 * @param tools parameter is pointer to the tools class.
+	 * @param data_length parameter is count of bytes in the buffer.
+	 *
+	 * The example use of eap_buf_chain_wr is as follows.
+	 * NOTE all sanity checks are ignored in the example.
+	 *
+	 * @code
+	 * eap_buf_chain_rd_c response_packet(
+	 *     eap_write_buffer_e, m_am_tools,
+	 *     PACKET_BUFFER_LENGTH);
+	 * const u32_t eap_header_offset = get_type_partner()->get_header_offset(
+	 *     &MTU, &trailer_length);
+	 * eap_header_rd_c * const eap_response = (eap_header_rd_c * const)
+	 *     response_packet.get_data_offset(eap_header_offset,
+	 *         (PACKET_BUFFER_LENGTH
+	 *         -(eap_header_offset+ trailer_length)));
+	 * @endcode
+	 */
+	EAP_FUNC_IMPORT eap_buf_chain_base_c(
+		const eap_write_buffer_e,
+		abs_eap_am_tools_c * const tools,
+		const u32_t data_length);
+
+	/**
+	 * The constructor of the eap_buf_chain_rd class initializes attributes using
+	 * the parameters passes to it.
+	 * New buffer is allocated from heap.
+	 * @param eap_write_buffer_e separates the write and read-only constructors.
+	 * @param tools parameter is pointer to the tools class.
+	 * @param data_length parameter is count of bytes in the buffer.
+	 *
+	 * The example use of eap_buf_chain_wr is as follows.
+	 * NOTE all sanity checks are ignored in the example.
+	 *
+	 * @code
+	 * eap_buf_chain_rd_c response_packet(
+	 *     eap_read_buffer, m_am_tools,
+	 *     PACKET_BUFFER_LENGTH);
+	 * const u32_t eap_header_offset = get_type_partner()->get_header_offset(
+	 *     &MTU, &trailer_length);
+	 * eap_header_rd_c * const eap_response = (eap_header_rd_c * const)
+	 *     response_packet.get_data_offset(eap_header_offset,
+	 *         (PACKET_BUFFER_LENGTH
+	 *         -(eap_header_offset+ trailer_length)));
+	 * @endcode
+	 */
+	EAP_FUNC_IMPORT eap_buf_chain_base_c(
+		const eap_read_buffer_e,
+		abs_eap_am_tools_c * const tools,
+		const u32_t data_length);
+
+	/**
+	 * @return Returns count of memory guard bytes.
+	 */
+	EAP_FUNC_IMPORT u32_t get_mem_guard_length();
+
+	/**
+	 * The get_buffer_length() function returns the length of buffer in bytes.
+	 */
+	EAP_FUNC_IMPORT u32_t get_buffer_length() const;
+
+	/**
+	 * The get_data_length() function returns count of data bytes in the buffer.
+	 */
+	EAP_FUNC_IMPORT u32_t get_data_length() const;
+
+	/**
+	 * The get_data_offset() function returns pointer to the data in offset (p_offset).
+	 * @param p_offset indicates the required offset.
+	 * @param p_continuous_bytes indicates how many bytes in continuous memory is needed.
+	 *
+	 * NOTE user of the eap_buf_chain_wr class must obtain the pointer to the data using
+	 * this or the get_data() function. These functions can handle the memory guard.
+	 */
+	EAP_FUNC_IMPORT u8_t * get_data_offset(const u32_t p_offset, const u32_t p_continuous_bytes) const;
+
+	/**
+	 * The get_data() function function returns pointer to the data.
+	 * @param p_continuous_bytes indicates how many bytes in continuous memory is needed.
+	 *
+	 * NOTE user of the eap_buf_chain_wr class must obtain the pointer to the data using
+	 * this or the get_data_offset() function. These functions can handle the memory guard.
+	 */
+	EAP_FUNC_IMPORT u8_t * get_data(const u32_t p_continuous_bytes) const;
+
+	/**
+	 * The set_buffer_length() function allocates the buffer of length bytes.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_buffer_length(const u32_t length);
+
+	/**
+	 * The set_data_length() function set the data length in the buffer.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_data_length(const u32_t length);
+
+	/**
+	 * The get_is_valid() function returns the status of the object.
+	 * @return True indicates the object is initialized.
+	 */
+	EAP_FUNC_IMPORT bool get_is_valid() const;
+
+	/**
+	 * The get_is_valid() function returns the status of the
+	 * data included in object.
+	 * @return True indicates the object includes valid data.
+	 */
+	EAP_FUNC_IMPORT bool get_is_valid_data() const;
+
+	/**
+	 * The set_is_manipulated() function sets flag to indicate this packet is manipulated.
+	 * This is used for testing purposes.
+	 */
+	EAP_FUNC_IMPORT void set_is_manipulated();
+
+	/**
+	 * The get_is_manipulated() function returns flag to indicate this packet is manipulated.
+	 * This is used for testing purposes.
+	 */
+	EAP_FUNC_IMPORT bool get_is_manipulated();
+
+	/**
+	 * This function sets the index of sent packet.
+	 * This is used for testing purposes.
+	 */
+	EAP_FUNC_IMPORT void set_send_packet_index(const u32_t send_packet_index);
+
+	/**
+	 * This function returns the index of sent packet.
+	 * This is used for testing purposes.
+	 */
+	EAP_FUNC_IMPORT u32_t get_send_packet_index();
+
+	/**
+	 * The set_random_error_type() function sets the type of manipulation of the packet.
+	 * This is used for testing purposes.
+	 */
+	EAP_FUNC_IMPORT void set_random_error_type(eap_random_error_type error_type);
+
+	/**
+	 * The get_random_error_type() function returns the type of manipulation of the packet.
+	 * This is used for testing purposes.
+	 */
+	EAP_FUNC_IMPORT eap_random_error_type get_random_error_type();
+
+	/**
+	 * The set_do_packet_retransmission() function sets the re-transmission flag of this packet.
+	 * Packet will be re-transmitted by lower layer when do_packet_retransmission_when_true is true.
+	 * Packet will not re-transmitted by lower layer when do_packet_retransmission_when_true is false.
+	 */
+	EAP_FUNC_IMPORT void set_do_packet_retransmission(const bool do_packet_retransmission_when_true);
+
+	/**
+	 * The set_do_packet_retransmission() function gets the re-transmission flag of this packet.
+	 */
+	EAP_FUNC_IMPORT bool get_do_packet_retransmission();
+
+	/**
+	 * This sets whether the sender is client or server.
+	 * This is used in testing.
+	 */
+	EAP_FUNC_IMPORT void set_is_client(const bool is_client_when_true);
+
+	/**
+	 * This gets whether the sender is client or server.
+	 * This is used in testing.
+	 */
+	EAP_FUNC_IMPORT bool get_is_client() const;
+
+	/**
+	 * This is used in testing.
+	 */
+	EAP_FUNC_IMPORT void set_do_length_checks(const bool do_length_checks);
+
+	/**
+	 * This is used in testing.
+	 */
+	EAP_FUNC_IMPORT bool get_do_length_checks() const;
+
+
+	/**
+	 * This sets whether this packet must be encrypted (true) or not (false).
+	 * Encryption means the WLAN data encryption on the air (WEP, TKIP or CCMP).
+	 * Using this flag to tell the encryption allows the configuration of the
+	 * temporal key beforehand the key is used.
+	 * This is optimization to fasten the key configuration.
+	 */
+	EAP_FUNC_IMPORT void set_encrypt(const bool encrypt_when_true);
+
+	/**
+	 * This gets whether this packet must be encrypted (true) or not (false).
+	 * Encryption means the WLAN data encryption on the air (WEP, TKIP or CCMP).
+	 * Using this flag to tell the encryption allows the configuration of the
+	 * temporal key beforehand the key is used.
+	 * This is optimization to fasten the key configuration.
+	 */
+	EAP_FUNC_IMPORT bool get_encrypt() const;
+
+
+	/**
+	 * This sets the pointer of sender stack.
+	 * This is used in testing.
+	 */
+	EAP_FUNC_IMPORT void set_stack_address(const void * const stack_address);
+
+	/**
+	 * This gets the pointer of sender stack.
+	 * This is used in testing.
+	 */
+	EAP_FUNC_IMPORT const void * get_stack_address() const;
+
+	/**
+	 * The add_data() function adds data to the end of the buffer.
+	 * If the buffer is empty the data is added to begin of the buffer.
+	 * @param buffer points the data to be added.
+	 * @param buffer_length is length of the buffer in bytes.
+	 */
+	EAP_FUNC_IMPORT eap_status_e add_data(
+		const void * const buffer,
+		const u32_t buffer_length);
+
+	/**
+	 * The add_data() function adds data to the end of the buffer.
+	 * If the buffer is empty the data is added to begin of the buffer.
+	 * @param buffer points the data to be added.
+	 */
+	EAP_FUNC_IMPORT eap_status_e add_data(
+		const eap_variable_data_c * const buffer);
+
+	/**
+	 * The add_data_to_offset() function adds data to the offset of the buffer.
+	 * @param offset tells the place where data will begin.
+	 * @param buffer points the data to be added.
+	 * @param buffer_length is length of the buffer in bytes.
+	 */
+	EAP_FUNC_IMPORT eap_status_e add_data_to_offset(
+		const u32_t offset,
+		const void * const buffer,
+		const u32_t buffer_length);
+
+	/**
+	 * The add_data() function adds data to the offset of the buffer.
+	 * @param offset tells the place where data will begin.
+	 * @param buffer points the data to be added.
+	 */
+	EAP_FUNC_IMPORT eap_status_e add_data_to_offset(
+		const u32_t offset,
+		const eap_variable_data_c * const buffer);
+
+	// 
+	//--------------------------------------------------
+}; // class eap_buf_chain_base_c
+
+
+
+/// Write only network packets are handled through eap_buf_chain_base_c class.
+/// Post-suffix _wr_c indicates the buffer has write attribute on.
+/// The eap_buf_chain_wr_c class is derived from eap_buf_chain_base class.
+class EAP_EXPORT eap_buf_chain_wr_c
+: public eap_buf_chain_base_c
+{
+private:
+
+	/**
+	 * Forses the inheritance.
+	 */
+	EAP_FUNC_IMPORT void force_inheritance();
+
+	//--------------------------------------------------
+protected:
+	//--------------------------------------------------
+
+	//--------------------------------------------------
+public:
+	//--------------------------------------------------
+
+	/**
+	 * The destructor does nothing special.
+	 */
+	EAP_FUNC_IMPORT virtual ~eap_buf_chain_wr_c();
+
+	/**
+	 * The costructor does nothing special. It just initializes all member attributes.
+	 * This version uses preallocated buffer.
+	 */
+	EAP_FUNC_IMPORT eap_buf_chain_wr_c(
+		const eap_write_buffer_e,
+		abs_eap_am_tools_c * const tools,
+		u8_t * const data,
+		const u32_t data_length,
+		const bool reset_data,
+		const bool free_buffer,
+		const u32_t mem_guard_length);
+
+	/**
+	 * The costructor does nothing special. It just initializes all member attributes.
+	 * This version allocates buffer from heap.
+	 */
+	EAP_FUNC_IMPORT eap_buf_chain_wr_c(
+		const eap_write_buffer_e,
+		abs_eap_am_tools_c * const tools,
+		const u32_t data_length);
+
+	/**
+	 * The costructor does nothing special. It just initializes all member attributes.
+	 * This version does not allocate buffer.
+	 * You must call set_buffer_length() member function to allocate buffer.
+	 */
+	EAP_FUNC_IMPORT eap_buf_chain_wr_c(
+		const eap_write_buffer_e,
+		abs_eap_am_tools_c * const tools);
+
+	/**
+	 * @return Returns the pointer to the ethernet header.
+	 */
+	EAP_FUNC_IMPORT u8_t * get_ethernet_header();
+
+	/**
+	 * The copy() function copies the eap_buf_chain_wr object.
+	 * Data is copied to new allocated buffer.
+	 */
+	EAP_FUNC_IMPORT eap_buf_chain_wr_c * copy();
+
+	// 
+	//--------------------------------------------------
+}; // class eap_buf_chain_wr_c
+
+
+/// Read only network packets are handled through eap_buf_chain_rd_c class.
+/// Post-suffix _rd_c indicates the buffer has read only attribute on.
+/// The eap_buf_chain_rd_c class is derived from eap_buf_chain_base class.
+class EAP_EXPORT eap_buf_chain_rd_c
+: public eap_buf_chain_base_c
+{
+private:
+
+	/**
+	 * Forses the inheritance.
+	 */
+	EAP_FUNC_IMPORT void force_inheritance();
+
+	//--------------------------------------------------
+protected:
+	//--------------------------------------------------
+
+	//--------------------------------------------------
+public:
+	//--------------------------------------------------
+
+	/**
+	 * The destructor of the eap_buf_chain_rd_c class checks memory guards.
+	 */
+	EAP_FUNC_IMPORT virtual ~eap_buf_chain_rd_c();
+
+	/**
+	 * The constructor of the eap_buf_chain_wr class initializes attributes using
+	 * the parameters passes to it.
+	 * @param eap_read_buffer_e separates the write and read-only constructors.
+	 * @param tools parameter is pointer to the tools class.
+	 * @param data is pointer to the buffer containing the message. 
+	 * @param data_length parameter is count of bytes in the buffer.
+	 * @param free_buffer parameter indicates whether the destructor must free the data buffer.
+	 *
+	 * The example use of eap_buf_chain_wr is as follows.
+	 * NOTE all sanity checks are ignored in the example.
+	 *
+	 * @code
+	 * u8_t packet_buffer[EAP_MEM_GUARDS(EAP_MAX_LOCAL_PACKET_BUFFER_LENGTH)];
+	 * eap_buf_chain_rd_c response_packet(
+	 *     eap_read_buffer, m_am_tools, packet_buffer,
+	 *     sizeof(packet_buffer), false);
+	 * const u32_t eap_header_offset = get_type_partner()->get_header_offset(
+	 *     &MTU, &trailer_length);
+	 * eap_header_rd_c * const eap_response = (eap_header_rd_c * const)
+	 *     response_packet.get_data_offset(eap_header_offset,
+	 *         (EAP_MAX_LOCAL_PACKET_BUFFER_LENGTH
+	 *         -(eap_header_offset+ trailer_length)));
+	 * @endcode
+	 */
+	EAP_FUNC_IMPORT eap_buf_chain_rd_c(
+		const eap_read_buffer_e, 
+		abs_eap_am_tools_c * const tools,
+		const u8_t * const data, 
+		const u32_t data_length,
+		const bool free_buffer);
+
+	/**
+	 * The costructor does nothing special. It just initializes all member attributes.
+	 * This version allocates buffer from heap.
+	 */
+	EAP_FUNC_IMPORT eap_buf_chain_rd_c(
+		const eap_read_buffer_e,
+		abs_eap_am_tools_c * const tools,
+		const u32_t data_length);
+
+	/**
+	 * The get_data() function function returns pointer to the data.
+	 * @param p_continuous_bytes indicates how many bytes in continuous memory is needed.
+	 *
+	 * NOTE user of the eap_buf_chain_wr class must obtain the pointer to the data using
+	 * this or the get_data_offset() function. These functions can handle the memory guard.
+	 */
+	EAP_FUNC_IMPORT const u8_t * get_data(const u32_t p_continuous_bytes) const;
+
+	/**
+	 * The get_data_offset() function returns pointer to the data in offset (p_offset).
+	 * @param p_offset indicates the required offset.
+	 * @param p_continuous_bytes indicates how many bytes in continuous memory is needed.
+	 *
+	 * NOTE user of the eap_buf_chain_wr class must obtain the pointer to the data using
+	 * this or the get_data() function. These functions can handle the memory guard.
+	 */
+	EAP_FUNC_IMPORT const u8_t * get_data_offset(const u32_t p_offset, const u32_t p_continuous_bytes) const;
+
+	/**
+	 * @return Returns the pointer to the ethernet header.
+	 */
+	EAP_FUNC_IMPORT const u8_t * get_ethernet_header() const;
+
+	// 
+	//--------------------------------------------------
+}; // class eap_buf_chain_rd_c
+
+
+#endif //#if !defined(_EAP_BUFFER_H_)
+
+//--------------------------------------------------
+
+
+
+// End.