wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/inc/core_wlan_eapol_if_message.h
changeset 0 c40eb8fe8501
child 24 e717b8f55620
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/inc/core_wlan_eapol_if_message.h	Tue Feb 02 02:03:13 2010 +0200
@@ -0,0 +1,778 @@
+/*
+* Copyright (c) 2005-2007 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:  Class for parsing and generating messages for Engine-EAPOL interface.
+*
+*/
+
+
+#ifndef CORE_WLAN_EAPOL_IF_MESSAGE_H
+#define CORE_WLAN_EAPOL_IF_MESSAGE_H
+
+#include "am_platform_libraries.h"
+#include "core_type_list.h"
+#include "core_types.h"
+#include "core_tools.h"
+
+// Compile time assert. Used to make sure that generated datatypes are correct size.
+#define COMPILE_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
+
+
+/**
+ * Class for parsing and generating WLAN EAPOL Plugin interface messages.
+ *
+ * @since S60 v3.2
+ */
+
+
+enum wlan_eapol_if_message_type_e
+    {
+    wlan_eapol_if_message_type_none                                 = 0,
+    wlan_eapol_if_message_type_array                                = 1,
+    wlan_eapol_if_message_type_boolean                              = 2,
+    wlan_eapol_if_message_type_eap_protocol_layer                   = 3,
+    wlan_eapol_if_message_type_eap_state_notification               = 4,
+    wlan_eapol_if_message_type_eap_status                           = 5,
+    wlan_eapol_if_message_type_eap_type                             = 6,
+    wlan_eapol_if_message_type_eapol_key_802_11_authentication_mode = 7,
+    wlan_eapol_if_message_type_eapol_key_authentication_type        = 8,
+    wlan_eapol_if_message_type_eapol_key_type                       = 9,
+    wlan_eapol_if_message_type_eapol_tkip_mic_failure_type          = 10,
+    wlan_eapol_if_message_type_eapol_wlan_authentication_state      = 11,
+    wlan_eapol_if_message_type_error                                = 12,
+    wlan_eapol_if_message_type_function                             = 13,
+    wlan_eapol_if_message_type_network_id                           = 14,
+    wlan_eapol_if_message_type_network_key                          = 15,
+    wlan_eapol_if_message_type_protected_setup_credential           = 16,
+    wlan_eapol_if_message_type_RSNA_cipher                          = 17,
+    wlan_eapol_if_message_type_session_key                          = 18,
+    wlan_eapol_if_message_type_u8_t                                 = 19,
+    wlan_eapol_if_message_type_u16_t                                = 20,
+    wlan_eapol_if_message_type_u32_t                                = 21,
+    wlan_eapol_if_message_type_u64_t                                = 22,
+    wlan_eapol_if_message_type_variable_data                        = 23,
+    };
+
+
+enum wlan_eapol_if_message_type_function_e
+    {
+    wlan_eapol_if_message_type_function_none                                        = 0,
+    wlan_eapol_if_message_type_function_check_pmksa_cache                           = 1,
+    wlan_eapol_if_message_type_function_start_authentication                        = 2,
+    wlan_eapol_if_message_type_function_complete_association                        = 3,
+    wlan_eapol_if_message_type_function_disassociation                              = 4,
+    wlan_eapol_if_message_type_function_start_preauthentication                     = 5,
+    wlan_eapol_if_message_type_function_start_reassociation                         = 6,
+    wlan_eapol_if_message_type_function_complete_reassociation                      = 7,
+    wlan_eapol_if_message_type_function_start_wpx_fast_roam_reassociation           = 8,
+    wlan_eapol_if_message_type_function_complete_wpx_fast_roam_reassociation        = 9,
+    wlan_eapol_if_message_type_function_packet_process                              = 10,
+    wlan_eapol_if_message_type_function_tkip_mic_failure                            = 11,
+    wlan_eapol_if_message_type_function_eap_acknowledge                             = 12,
+    wlan_eapol_if_message_type_function_update_header_offset                        = 13,
+    wlan_eapol_if_message_type_function_complete_check_pmksa_cache                  = 14,
+    wlan_eapol_if_message_type_function_packet_send                                 = 15,
+    wlan_eapol_if_message_type_function_associate                                   = 16,
+    wlan_eapol_if_message_type_function_disassociate                                = 17,
+    wlan_eapol_if_message_type_function_packet_data_session_key                     = 18,
+    wlan_eapol_if_message_type_function_state_notification                          = 19,
+    wlan_eapol_if_message_type_function_reassociate                                 = 20,
+    wlan_eapol_if_message_type_function_update_wlan_database_reference_values       = 21,
+    wlan_eapol_if_message_type_function_complete_start_wpx_fast_roam_reassociation  = 22,
+    wlan_eapol_if_message_type_function_new_protected_setup_credentials             = 23,
+    };
+
+
+
+static const u32_t WLAN_EAPOL_MESSAGE_IF_TYPE_OFFSET   = 0;
+static const u32_t WLAN_EAPOL_MESSAGE_IF_LENGTH_OFFSET = 4;
+static const u32_t WLAN_EAPOL_MESSAGE_IF_DATA_OFFSET   = 8;
+
+
+
+class network_id_c
+    {
+public:
+    
+    /**
+     * Constructor
+     */
+    network_id_c(
+        u8_t * source, u32_t source_length,
+        u8_t * destination, u32_t destination_length,
+        u16_t packet_type ) 
+        : source_ptr( source )
+        , source_length( source_length )
+        , destination_ptr( destination )
+        , destination_length( destination_length )
+        , packet_type( packet_type )
+        , source_m( ZERO_MAC_ADDR )
+        , destination_m( ZERO_MAC_ADDR )
+        {
+        }
+
+    /** 
+     * Destructor.
+     */
+    ~network_id_c()
+        {
+        source_ptr = NULL;
+        destination_ptr = NULL;
+        }
+
+    const core_mac_address_s& source()
+        {
+        if( source_ptr )
+            {
+            core_tools_c::copy(
+                &source_m.addr[0],
+                source_ptr,
+                MAC_ADDR_LEN );
+            }
+
+        return source_m;
+        }
+
+    const core_mac_address_s& destination()
+        {
+        if( destination_ptr )
+            {
+            core_tools_c::copy(
+                &destination_m.addr[0],
+                destination_ptr,
+                MAC_ADDR_LEN );
+            }
+
+        return destination_m;
+        }
+
+public: // data
+
+    u8_t * source_ptr;
+    u32_t source_length;
+    u8_t * destination_ptr;
+    u32_t destination_length;
+    u16_t packet_type;
+    core_mac_address_s source_m;
+    core_mac_address_s destination_m;
+    };
+
+
+
+
+
+class session_key_c
+    {
+public:
+    
+    /**
+     * Constructor
+     */
+    session_key_c(
+        u8_t * key, u32_t key_length,
+        u8_t * sequence_number, u32_t sequence_number_length,
+        wlan_eapol_if_eapol_key_type_e eapol_key_type,
+        u32_t key_index,
+        bool_t key_tx_bit )
+        : key( key )
+        , key_length( key_length )
+        , sequence_number( sequence_number )
+        , sequence_number_length( sequence_number_length )
+        , eapol_key_type( eapol_key_type )
+        , key_index( key_index )
+        , key_tx_bit( key_tx_bit )
+        { }
+    
+    /** 
+     * Destructor.
+     */
+    ~session_key_c()
+        {
+        key = NULL;
+        sequence_number = NULL;
+        }
+
+public: // data
+
+    u8_t * key;
+    u32_t key_length;
+    
+    u8_t * sequence_number;
+    u32_t sequence_number_length;
+    
+    wlan_eapol_if_eapol_key_type_e eapol_key_type;
+    u32_t key_index;
+    bool_t key_tx_bit;
+    };
+
+
+
+
+
+class state_notification_c
+    {
+public:
+
+    /**
+     * Constructor
+     */
+    state_notification_c(
+        const network_id_c * network_id,
+        wlan_eapol_if_eap_protocol_layer_e protocol_layer,
+        u32_t protocol,
+        u32_t eap_type_vendor_id,
+        u32_t eap_type_vendor_type,
+        u32_t current_state,
+        bool_t is_client,
+        wlan_eapol_if_eap_status_e authentication_error )
+        : network_id( *network_id )
+        , protocol_layer( protocol_layer )
+        , protocol( protocol )
+        , eap_type_vendor_id( eap_type_vendor_id )
+        , eap_type_vendor_type( eap_type_vendor_type )
+        , current_state( current_state )
+        , is_client( is_client )
+        , authentication_error( authentication_error )
+        { }
+    
+    /** 
+     * Destructor.
+     */
+    ~state_notification_c()
+        { }
+
+public: // data
+
+    network_id_c network_id;
+    wlan_eapol_if_eap_protocol_layer_e protocol_layer;
+    u32_t protocol;
+    u32_t eap_type_vendor_id;
+    u32_t eap_type_vendor_type;
+    u32_t current_state;
+    bool_t is_client;
+    wlan_eapol_if_eap_status_e authentication_error;
+    
+    };
+
+
+class network_key_c
+    {
+public:
+    
+    /**
+     * Constructor
+     */
+    network_key_c(
+        u8_t network_key_index,
+        u8_t * network_key,
+        u32_t network_key_length )
+        : network_key_index( network_key_index )
+        , network_key( network_key )
+        , network_key_length( network_key_length )
+        { }
+    
+    /** 
+     * Destructor.
+     */
+    ~network_key_c()
+        {
+        network_key = NULL;
+        }
+
+public: // data
+
+    u8_t network_key_index;
+    u8_t * network_key;
+    u32_t network_key_length;
+    
+    };
+
+
+class protected_setup_credential_c
+    {
+public:
+    
+    /**
+     * Constructor
+     */
+    protected_setup_credential_c(
+        u8_t network_index,
+        u8_t * ssid,
+        u32_t ssid_length,
+        u16_t authentication_type,
+        u16_t encryption_type,
+        u8_t * mac_address,
+        u32_t mac_address_length )
+        : network_index( network_index )
+        , ssid( ssid )
+        , ssid_length( ssid_length )
+        , authentication_type( authentication_type )
+        , encryption_type( encryption_type )
+        , network_key_list( )
+        , mac_address( mac_address )
+        , mac_address_length( mac_address_length )
+        { }
+    
+    /** 
+     * Destructor.
+     */
+    ~protected_setup_credential_c()
+        {
+        ssid = NULL;
+        mac_address = NULL;
+        }
+
+public: // data
+
+    u8_t network_index;
+    u8_t * ssid;
+    u32_t ssid_length;
+    u16_t authentication_type;
+    u16_t encryption_type;
+    core_type_list_c<network_key_c> network_key_list;
+    u8_t * mac_address;
+    u32_t mac_address_length;
+    
+    };
+
+
+
+
+
+
+
+
+//NONSHARABLE_CLASS( core_wlan_eapol_if_parameter_c )
+
+class core_wlan_eapol_if_parameter_c
+    {
+public:
+
+    /**
+     * Constructor
+     */
+    core_wlan_eapol_if_parameter_c();
+    
+    /**
+     * Constructor
+     *
+     * @param data Pointer to the TLV encoded data.
+     * @param data_length Length of the TLV encoded data.
+     */
+    core_wlan_eapol_if_parameter_c(
+        u8_t *data, u32_t data_length );
+    
+    /** 
+     * Destructor.
+     */
+    ~core_wlan_eapol_if_parameter_c();
+    
+    /**
+     * Update content of parameter
+     *
+     * @param data Pointer to the TLV encoded data.
+     * @param data_length Length of the TLV encoded data.
+     */
+    void update(
+        u8_t *data, u32_t data_length );
+
+    
+    // ============================================================================
+    // General methods to handle parameters
+    
+    u32_t size() const;
+
+    wlan_eapol_if_message_type_e get_parameter_type() const;
+
+    u32_t get_parameter_length() const;
+
+    u8_t* get_data() const;
+    
+
+    // ============================================================================
+    // Parameter specific methods
+    
+    // All 32 bit base types
+    core_error_e set_parameter_data( 
+        wlan_eapol_if_message_type_e type, 
+        u32_t value );
+
+    // All already generated structures, arrays and variable data
+    core_error_e set_parameter_data( 
+        wlan_eapol_if_message_type_e type, 
+        const u8_t* data, u32_t length );
+
+    // EAP type
+    core_error_e set_parameter_data( 
+        wlan_eapol_if_message_type_e type, 
+        u32_t vendor_id, 
+        u32_t vendor_type );
+
+    core_error_e set_parameter_data_boolean( 
+        wlan_eapol_if_message_type_e type, 
+        bool_t boolean );
+
+    core_error_e set_parameter_data_u16_t( 
+        wlan_eapol_if_message_type_e type, 
+        u16_t value );
+
+    core_error_e set_parameter_data_u8_t( 
+        wlan_eapol_if_message_type_e type, 
+        u8_t value );
+
+    core_error_e set_parameter_data_u64_t(
+        u64_t data );
+
+    // ============================================================================
+
+    // All 32 bit values
+    core_error_e get_parameter_data(
+        u32_t * value ) const;
+    
+    // 
+    core_error_e get_parameter_data(
+        u64_t * value ) const;
+
+    // 
+    core_error_e get_parameter_data(
+        bool_t * value ) const;
+
+    core_error_e get_parameter_data(
+        u16_t * value ) const;
+
+    core_error_e get_parameter_data(
+        u8_t * value ) const;
+
+    core_error_e get_parameter_data(
+        u8_t ** const data, u32_t * data_length ) const;
+
+    core_error_e get_parameter_data(
+        u32_t * vendor_id, 
+        u32_t * vendor_type ) const;
+
+
+// ============================================================================
+
+private:
+
+    core_error_e reserve_buffer(
+        u32_t needed_buffer_length  );
+
+    void add_header(
+        wlan_eapol_if_message_type_e type, 
+        u32_t length );
+
+    u64_t get_parameter_u64_t() const;
+
+    void add_parameter_u32_t(
+        u32_t data );
+
+    u32_t get_parameter_u32_t() const;
+
+    void add_parameter_u16_t(
+        u16_t data );
+
+    u16_t get_parameter_u16_t() const;
+
+    void add_parameter_u8_t(
+        u8_t data );
+
+    u8_t get_parameter_u8_t() const;
+
+private: // Data
+
+    u8_t * data_m;           // This is pointer to current buffer
+    u32_t buffer_length_m;
+    bool_t delete_buffer_m;
+    
+    };
+
+
+
+
+
+
+
+
+
+
+class core_wlan_eapol_if_function_c
+    {
+public:
+
+    /**
+     * Constructor
+     */
+    core_wlan_eapol_if_function_c();
+
+    /**
+     * Constructor
+     *
+     * @param data Pointer to the IE data.
+     * @param data_length Length of the IE data.
+     */
+    core_wlan_eapol_if_function_c(
+        u8_t * data,
+        const u32_t length );
+    
+    /** 
+     * Destructor.
+     */
+    ~core_wlan_eapol_if_function_c();
+    
+    
+    wlan_eapol_if_message_type_e get_type();
+
+    wlan_eapol_if_message_type_function_e get_function();
+    
+    core_error_e append(
+        const core_wlan_eapol_if_parameter_c * const param );
+
+    u32_t size() const;
+
+    u8_t* get_data();
+
+    void clear();
+    
+    // ============================================================================
+    
+    // Iterators
+    void first();
+    
+    void next();
+
+    const core_wlan_eapol_if_parameter_c* current();
+    
+    bool_t is_done() const;
+
+    // ============================================================================
+    // Methods to generate and parse structured datatypes
+    
+    core_error_e reserve_buffer(
+        u32_t needed_buffer_length );
+
+    // Higher level methods to handle structured parameters and functions
+    
+    core_error_e generate_network_id(
+        const network_id_c * const network_id );
+    
+    core_error_e parse_network_id(
+        network_id_c * network_id );
+
+    core_error_e generate_network_key(
+        network_key_c * network_key );
+    
+    core_error_e parse_network_key(
+        network_key_c * network_key );
+
+    core_error_e generate_protected_setup_credential(
+        protected_setup_credential_c * credential );
+    
+    core_error_e parse_protected_setup_credential(
+        protected_setup_credential_c * credential );
+
+    core_error_e generate_session_key(
+        session_key_c * session_key );
+
+    core_error_e parse_session_key(
+        session_key_c * session_key );
+
+    core_error_e generate_eap_state_notification(
+        state_notification_c * state_notification );
+
+    core_error_e parse_eap_state_notification(
+        state_notification_c * state_notification );
+
+
+    // ============================================================================
+    // Methods to generate and parse functions
+
+    core_error_e check_pmksa_cache(
+        core_type_list_c<network_id_c> & network_id_list,
+        const wlan_eapol_if_eapol_key_authentication_type_e selected_eapol_key_authentication_type,
+        const wlan_eapol_if_rsna_cipher_e pairwise_key_cipher_suite,
+        const wlan_eapol_if_rsna_cipher_e group_key_cipher_suite );
+
+    core_error_e start_authentication(
+        u8_t * ssid, const u32_t ssid_length, 
+        const wlan_eapol_if_eapol_key_authentication_type_e selected_eapol_key_authentication_type,
+        u8_t * wpa_psk, const u32_t wpa_psk_length, 
+        const bool_t wpa_override_enabled,
+        const network_id_c * receive_network_id );
+
+    core_error_e complete_association(
+        const wlan_eapol_if_eapol_wlan_authentication_state_e association_result,
+        const network_id_c * network_id,
+        u8_t * received_wpa_ie, const u32_t received_wpa_ie_length,
+        u8_t * sent_wpa_ie, const u32_t sent_wpa_ie_length,
+        const wlan_eapol_if_rsna_cipher_e pairwise_key_cipher_suite,
+        const wlan_eapol_if_rsna_cipher_e group_key_cipher_suite );
+    
+    core_error_e disassociation(
+        const network_id_c * network_id );
+
+    core_error_e start_preauthentication(
+        const network_id_c * network_id );
+
+    core_error_e start_reassociation(
+        const network_id_c * old_network_id,
+        const network_id_c * new_network_id,
+        const wlan_eapol_if_eapol_key_authentication_type_e selected_eapol_key_authentication_type );
+        
+    core_error_e complete_reassociation(
+        const wlan_eapol_if_eapol_wlan_authentication_state_e association_result,
+        const network_id_c * network_id,
+        u8_t * received_wpa_ie, const u32_t received_wpa_ie_length,
+        u8_t * sent_wpa_ie, const u32_t sent_wpa_ie_length,
+        const wlan_eapol_if_rsna_cipher_e pairwise_key_cipher_suite,
+        const wlan_eapol_if_rsna_cipher_e group_key_cipher_suite );
+    
+    core_error_e start_wpx_fast_roam_reassociation(
+        const network_id_c * old_network_id,
+        const network_id_c * new_network_id,
+        u8_t * reassociation_request_ie,
+        const u32_t reassociation_request_ie_length,
+        const u8_t* received_wpa_ie,
+        u32_t received_wpa_ie_length,
+        const u8_t* sent_wpa_ie,
+        u32_t sent_wpa_ie_length );
+
+    core_error_e complete_wpx_fast_roam_reassociation(
+        const wlan_eapol_if_eapol_wlan_authentication_state_e reassociation_result,
+        const network_id_c * network_id,
+        u8_t * received_reassociation_ie, const u32_t received_reassociation_ie_length );
+
+    core_error_e packet_process(
+        const network_id_c * network_id,
+        const u8_t * packet_data, const u32_t packet_data_length );
+
+    core_error_e tkip_mic_failure(
+        const network_id_c * network_id,
+        const bool_t is_fatal_failure, 
+        const wlan_eapol_if_eapol_tkip_mic_failure_type_e tkip_mic_failure_type );
+
+    core_error_e eap_acknowledge(
+        const network_id_c * network_id );
+
+    core_error_e update_header_offset(
+        const u32_t header_offset,
+        const u32_t MTU,
+        const u32_t trailer_length );
+
+
+    
+    core_error_e generate_complete_check_pmksa_cache(
+        core_type_list_c<network_id_c> & network_id_list );
+    
+    core_error_e parse_complete_check_pmksa_cache(
+        core_type_list_c<network_id_c> & network_id_list );
+    
+    core_error_e generate_packet_send(
+        network_id_c * send_network_id,
+        u8_t * packet_data, const u32_t packet_data_length );
+
+    core_error_e parse_packet_send(
+        network_id_c * send_network_id,
+        u8_t ** packet_data, u32_t * packet_data_length );
+
+    core_error_e generate_associate(
+        const wlan_eapol_if_eapol_key_authentication_mode_e authentication_mode );
+
+    core_error_e parse_associate(
+        wlan_eapol_if_eapol_key_authentication_mode_e * authentication_mode );
+    
+    core_error_e generate_disassociate(
+        network_id_c * receive_network_id,
+        const bool_t self_disassociation );
+
+    core_error_e parse_disassociate(
+        network_id_c * receive_network_id,
+        bool_t * self_disassociation );
+
+    core_error_e generate_packet_data_session_key(
+        network_id_c * send_network_id,
+        session_key_c * session_key );
+
+    core_error_e parse_packet_data_session_key(
+        network_id_c * send_network_id,
+        session_key_c * session_key );
+
+    core_error_e generate_state_notification(
+        state_notification_c * state_notification );
+
+    core_error_e parse_state_notification(
+        state_notification_c * state_notification );
+
+    core_error_e generate_reassociate(
+        network_id_c * send_network_id,
+        wlan_eapol_if_eapol_key_authentication_type_e authentication_type,
+        u8_t * pmkid,
+        u32_t pmkid_length );
+
+    core_error_e parse_reassociate(
+        network_id_c * send_network_id,
+        wlan_eapol_if_eapol_key_authentication_type_e * authentication_type,
+        u8_t ** pmkid,
+        u32_t * pmkid_length );
+
+    core_error_e update_wlan_database_reference_values(
+        u8_t * database_reference_value, const u32_t database_reference_value_length );
+
+    core_error_e generate_complete_start_wpx_fast_roam_reassociation(
+        network_id_c * receive_network_id,
+        u8_t * reassociation_request_ie,
+        u32_t reassociation_request_ie_length );
+
+    core_error_e parse_complete_start_wpx_fast_roam_reassociation(
+        network_id_c * receive_network_id,
+        u8_t ** reassociation_request_ie,
+        u32_t * reassociation_request_ie_length );
+
+    core_error_e generate_error(
+        wlan_eapol_if_error_e errorcode,
+        wlan_eapol_if_message_type_function_e function );
+
+    core_error_e parse_error(
+        wlan_eapol_if_error_e * errorcode,
+        wlan_eapol_if_message_type_function_e * function );
+
+    core_error_e generate_new_protected_setup_credentials(
+        core_type_list_c< protected_setup_credential_c > & credential_list );
+
+    core_error_e parse_new_protected_setup_credentials(
+        core_type_list_c< protected_setup_credential_c > & credential_list );
+
+
+    void debug_print();
+    
+    void debug_print_type_string(
+        wlan_eapol_if_message_type_e type, 
+        u32_t length );
+
+    void debug_print_function_string(
+        wlan_eapol_if_message_type_function_e function );
+
+private: // Data
+
+    u8_t * data_m;           // This is pointer to current buffer
+    u32_t data_length_m;
+    u32_t buffer_length_m;
+    bool_t delete_buffer_m;
+
+    u32_t iter_m;
+    core_wlan_eapol_if_parameter_c current_parameter_m;
+    
+    };
+
+
+#endif // CORE_WLAN_EAPOL_IF_MESSAGE_H