wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_wlan_eapol_interface.cpp
changeset 0 c40eb8fe8501
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_wlan_eapol_interface.cpp	Tue Feb 02 02:03:13 2010 +0200
@@ -0,0 +1,622 @@
+/*
+* Copyright (c) 2001-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:  Interface to EAPOL authentication protocols.
+*
+*/
+
+
+// INCLUDE FILES
+
+#include "core_wlan_eapol_interface.h"
+#include "abs_core_server_callback.h"
+#include "core_tools.h"
+
+// LOCAL CONSTANTS
+
+const uint_t CORE_EAPOL_TRAILER_LENGTH = 0;
+const uint_t CORE_EAPOL_HEADER_OFFSET  = 0;
+const uint_t CORE_EAPOL_MTU_VALUE = 1500;
+
+// ================= MEMBER FUNCTIONS =======================
+
+//--------------------------------------------------
+
+core_wlan_eapol_interface_c::core_wlan_eapol_interface_c(
+    abs_core_server_callback_c& wlm_callback ) :
+    wlm_callback_m( wlm_callback ),
+    function( ),
+    completed_check_pmksa_cache_list( ),
+    stored_frame_m( NULL ),
+    eapol_mode_m( core_eapol_operating_mode_wfa ),
+    authentication_type_m( wlan_eapol_if_eapol_key_authentication_type_none )
+    {
+    DEBUG( "core_wlan_eapol_interface_c::core_wlan_eapol_interface_c()" );
+    }
+
+//--------------------------------------------------
+
+core_wlan_eapol_interface_c::~core_wlan_eapol_interface_c()
+    {
+    DEBUG( "core_wlan_eapol_interface_c::~core_wlan_eapol_interface_c()" );
+
+    delete stored_frame_m;
+    }
+
+//--------------------------------------------------
+
+//
+core_error_e core_wlan_eapol_interface_c::convert_if_status_to_core_error( const u32_t if_status )
+    {
+    DEBUG1( "core_wlan_eapol_interface_c::convert_if_status_to_core_error( %i )", if_status );
+    
+    switch ( if_status )
+        {
+        case wlan_eapol_if_error_ok:
+            return core_error_ok;
+        case wlan_eapol_if_error_pending_request:
+            return core_error_request_pending;
+        case wlan_eapol_if_error_allocation_error:
+            return core_error_no_memory;
+        case wlan_eapol_if_error_illegal_parameter:
+            return core_error_illegal_argument;
+        case wlan_eapol_if_error_process_general_error:
+            return core_error_general;
+        default:
+            DEBUG( "core_wlan_eapol_interface_c::convert_if_status_to_core_error - Error: unknown status" );
+            return core_error_general;
+        }
+    }
+
+//--------------------------------------------------
+
+//
+core_error_e core_wlan_eapol_interface_c::load_eapol( 
+    core_eapol_operating_mode_e mode,
+    abs_wlan_eapol_callback_c* const eapol_handler )
+    {
+    DEBUG( "core_wlan_eapol_interface_c::load_eapol()" );
+
+    eapol_mode_m = mode;
+    return core_wlan_eapol_interface_c::convert_if_status_to_core_error( 
+        wlm_callback_m.load_eapol( mode, eapol_handler ) );
+    }
+
+//--------------------------------------------------
+
+//
+core_error_e core_wlan_eapol_interface_c::shutdown()
+    {
+    DEBUG( "core_wlan_eapol_interface_c::shutdown()" );
+    return core_wlan_eapol_interface_c::convert_if_status_to_core_error( 
+        wlm_callback_m.shutdown() );
+    }
+
+//--------------------------------------------------
+
+core_error_e core_wlan_eapol_interface_c::configure()
+    {
+    DEBUG( "core_wlan_eapol_interface_c::configure()" );
+    return core_wlan_eapol_interface_c::convert_if_status_to_core_error( 
+        wlm_callback_m.configure(
+            CORE_EAPOL_HEADER_OFFSET,
+            CORE_EAPOL_MTU_VALUE,
+            CORE_EAPOL_TRAILER_LENGTH ) );
+    }
+
+//--------------------------------------------------
+
+//
+core_error_e core_wlan_eapol_interface_c::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 )
+    {
+    DEBUG( "core_wlan_eapol_interface_c::check_pmksa_cache()" );
+    core_error_e error = function.check_pmksa_cache(
+        network_id_list,
+        selected_eapol_key_authentication_type, 
+        pairwise_key_cipher_suite,
+        group_key_cipher_suite );
+    
+    if ( error != core_error_ok )
+        {
+        DEBUG1( "core_wlan_eapol_interface_c::check_pmksa_cache() - Encoding function returns %i", error );
+        return error;
+        }
+    return core_wlan_eapol_interface_c::convert_if_status_to_core_error( 
+        wlm_callback_m.process_data( function.get_data(), function.size()) );
+    }
+
+//--------------------------------------------------
+
+//
+core_error_e core_wlan_eapol_interface_c::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 * network_id )
+    {
+    DEBUG( "core_wlan_eapol_interface_c::start_authentication()" );
+
+    authentication_type_m = selected_eapol_key_authentication_type;
+
+    core_error_e error = function.start_authentication(
+        ssid, ssid_length,
+        selected_eapol_key_authentication_type,
+        wpa_psk, wpa_psk_length,
+        wpa_override_enabled,
+        network_id );
+    
+    if ( error != core_error_ok )
+        {
+        DEBUG1( "core_wlan_eapol_interface_c::start_authentication() - Encoding function returns %i", error );
+        return error;
+        }
+    return core_wlan_eapol_interface_c::convert_if_status_to_core_error( 
+        wlm_callback_m.process_data( function.get_data(), function.size()) );
+    }
+
+//--------------------------------------------------
+
+//
+core_error_e core_wlan_eapol_interface_c::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 )
+    {
+    DEBUG( "core_wlan_eapol_interface_c::complete_association()" );
+    core_error_e error = function.complete_association(
+        association_result,
+        network_id,
+        received_wpa_ie, received_wpa_ie_length,
+        sent_wpa_ie, sent_wpa_ie_length,
+        pairwise_key_cipher_suite,
+        group_key_cipher_suite );
+    
+    if ( error != core_error_ok )
+        {
+        DEBUG1( "core_wlan_eapol_interface_c::complete_association() - Encoding function returns %i", error );
+        return error;
+        }
+    return core_wlan_eapol_interface_c::convert_if_status_to_core_error( 
+        wlm_callback_m.process_data( function.get_data(), function.size()) );
+    }
+
+//--------------------------------------------------
+
+//
+core_error_e core_wlan_eapol_interface_c::disassociation(
+    const network_id_c * network_id ) ///< source includes remote address, destination includes local address.
+    {
+    DEBUG( "core_wlan_eapol_interface_c::disassociation()" );
+    core_error_e error = function.disassociation(
+        network_id );
+    
+    if ( error != core_error_ok )
+        {
+        DEBUG1( "core_wlan_eapol_interface_c::disassociation() - Encoding function returns %i", error );
+        return error;
+        }
+    core_wlan_eapol_interface_c::convert_if_status_to_core_error( 
+        wlm_callback_m.process_data( function.get_data(), function.size()) );
+    return error;
+    }
+
+
+//--------------------------------------------------
+
+
+//
+core_error_e core_wlan_eapol_interface_c::start_preauthentication(
+    const network_id_c * network_id )
+    {
+    DEBUG( "core_wlan_eapol_interface_c::start_preauthentication()" );
+    core_error_e error = function.start_preauthentication(
+        network_id );
+    
+    if ( error != core_error_ok )
+        {
+        DEBUG1( "core_wlan_eapol_interface_c::start_preauthentication() - Encoding function returns %i", error );
+        return error;
+        }
+    core_wlan_eapol_interface_c::convert_if_status_to_core_error( 
+        wlm_callback_m.process_data( function.get_data(), function.size()) );
+    return error;
+    }
+
+
+//--------------------------------------------------
+
+//
+core_error_e core_wlan_eapol_interface_c::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 )
+    {
+    DEBUG( "core_wlan_eapol_interface_c::start_reassociation()" );
+
+    authentication_type_m = selected_eapol_key_authentication_type;
+
+    core_error_e error = function.start_reassociation(
+        old_network_id,
+        new_network_id, 
+        selected_eapol_key_authentication_type );
+    
+    if ( error != core_error_ok )
+        {
+        DEBUG1( "core_wlan_eapol_interface_c::start_reassociation() - Encoding function returns %i", error );
+        return error;
+        }
+    core_wlan_eapol_interface_c::convert_if_status_to_core_error( 
+        wlm_callback_m.process_data( function.get_data(), function.size()) );
+    return error;
+    }
+
+//--------------------------------------------------
+
+//
+core_error_e core_wlan_eapol_interface_c::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 )
+    {
+    DEBUG( "core_wlan_eapol_interface_c::complete_reassociation()" );
+    core_error_e error = function.complete_reassociation(
+        association_result,
+        network_id,
+        received_wpa_ie, received_wpa_ie_length,
+        sent_wpa_ie, sent_wpa_ie_length,
+        pairwise_key_cipher_suite,
+        group_key_cipher_suite );
+    
+    if ( error != core_error_ok )
+        {
+        DEBUG1( "core_wlan_eapol_interface_c::complete_reassociation() - Encoding function returns %i", error );
+        return error;
+        }
+    core_wlan_eapol_interface_c::convert_if_status_to_core_error( 
+        wlm_callback_m.process_data( function.get_data(), function.size()) );
+    return error;
+    }
+
+
+//--------------------------------------------------
+
+//
+core_error_e core_wlan_eapol_interface_c::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 )
+    {
+    DEBUG( "core_wlan_eapol_interface_c::start_wpx_fast_roam_reassociation()" );
+
+    authentication_type_m = wlan_eapol_if_eapol_key_authentication_type_wpx_fast_roam;
+
+    core_error_e error = function.start_wpx_fast_roam_reassociation(
+        old_network_id,
+        new_network_id,
+        reassociation_request_ie,
+        reassociation_request_ie_length,
+        received_wpa_ie,
+        received_wpa_ie_length,
+        sent_wpa_ie,
+        sent_wpa_ie_length );
+
+    if ( error != core_error_ok )
+        {
+        DEBUG1( "core_wlan_eapol_interface_c::start_wpx_fast_roam_reassociation() - Encoding function returns %i", error );
+        return error;
+        }
+    core_wlan_eapol_interface_c::convert_if_status_to_core_error( 
+        wlm_callback_m.process_data( function.get_data(), function.size()) );
+    return error;
+    }
+
+//--------------------------------------------------
+
+//
+core_error_e core_wlan_eapol_interface_c::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 )
+    {
+    DEBUG( "core_wlan_eapol_interface_c::complete_wpx_fast_roam_reassociation()" );
+    core_error_e error = function.complete_wpx_fast_roam_reassociation(
+        reassociation_result,
+        network_id,
+        received_reassociation_ie, received_reassociation_ie_length );
+    
+    if ( error != core_error_ok )
+        {
+        DEBUG1( "core_wlan_eapol_interface_c::complete_wpx_fast_roam_reassociation() - Encoding function returns %i", error );
+        return error;
+        }
+    core_wlan_eapol_interface_c::convert_if_status_to_core_error( 
+        wlm_callback_m.process_data( function.get_data(), function.size()) );
+    return error;
+    }
+
+
+//--------------------------------------------------
+
+//
+core_error_e core_wlan_eapol_interface_c::process_frame(
+    const core_frame_ethernet_c& frame )
+    {
+    DEBUG( "core_wlan_eapol_interface_c::process_frame()" );
+
+    core_mac_address_s destination =
+        frame.destination();
+    core_mac_address_s source =
+        frame.source();
+
+    network_id_c network_id(
+        const_cast<u8_t*>( &source.addr[0] ),
+        MAC_ADDR_LEN,
+        &destination.addr[0],
+        MAC_ADDR_LEN,
+        frame.type() );
+
+    core_error_e error = function.packet_process(
+        &network_id,
+        frame.data(), frame.data_length() );
+
+    if ( error != core_error_ok )
+        {
+        DEBUG1( "core_wlan_eapol_interface_c::process_frame() - Encoding function returns %i", error );
+        return error;
+        }
+    core_wlan_eapol_interface_c::convert_if_status_to_core_error( 
+        wlm_callback_m.process_data( function.get_data(), function.size()) );
+    return error;
+    }
+
+//--------------------------------------------------
+
+//
+core_error_e core_wlan_eapol_interface_c::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 )
+    {
+    DEBUG( "core_wlan_eapol_interface_c::tkip_mic_failure()" );
+    
+    core_error_e error = function.tkip_mic_failure(
+        network_id,
+        is_fatal_failure, 
+        tkip_mic_failure_type );
+    
+    if ( error != core_error_ok )
+        {
+        DEBUG1( "core_wlan_eapol_interface_c::tkip_mic_failure() - Encoding function returns %i", error );
+        return error;
+        }
+    core_wlan_eapol_interface_c::convert_if_status_to_core_error( 
+        wlm_callback_m.process_data( function.get_data(), function.size()) );
+    return error;
+    }
+
+//--------------------------------------------------
+
+//
+core_error_e core_wlan_eapol_interface_c::eap_acknowledge(
+    const network_id_c * network_id )
+    {
+    DEBUG( "core_wlan_eapol_interface_c::eap_acknowledge()" );
+    core_error_e error = function.eap_acknowledge(
+        network_id );
+    
+    if ( error != core_error_ok )
+        {
+        DEBUG1( "core_wlan_eapol_interface_c::eap_acknowledge() - Encoding function returns %i", error );
+        return error;
+        }
+    core_wlan_eapol_interface_c::convert_if_status_to_core_error( 
+        wlm_callback_m.process_data( function.get_data(), function.size()) );
+    return error;
+    }
+
+//--------------------------------------------------
+
+core_error_e core_wlan_eapol_interface_c::update_header_offset(
+    const u32_t header_offset,
+    const u32_t MTU,
+    const u32_t trailer_length )
+    {
+    DEBUG( "core_wlan_eapol_interface_c::update_header_offset()" );
+    core_error_e error = function.update_header_offset(
+        header_offset,
+        MTU, 
+        trailer_length );
+    
+    if ( error != core_error_ok )
+        {
+        DEBUG1( "core_wlan_eapol_interface_c::update_header_offset() - Encoding function returns %i", error );
+        return error;
+        }
+    core_wlan_eapol_interface_c::convert_if_status_to_core_error( 
+        wlm_callback_m.process_data( function.get_data(), function.size()) );
+    return error;
+    }
+
+//--------------------------------------------------				
+
+core_error_e core_wlan_eapol_interface_c::update_wlan_database_reference_values(
+    u8_t * database_reference_value, const u32_t database_reference_value_length )
+    {
+    DEBUG( "core_wlan_eapol_interface_c::update_wlan_database_reference_values()" );
+    core_error_e error = function.update_wlan_database_reference_values(
+        database_reference_value, database_reference_value_length );
+    
+    if ( error != core_error_ok )
+        {
+        DEBUG1( "core_wlan_eapol_interface_c::update_wlan_database_reference_values() - Encoding function returns %i", error );
+        return error;
+        }
+    core_wlan_eapol_interface_c::convert_if_status_to_core_error( 
+        wlm_callback_m.process_data( function.get_data(), function.size()) );
+    return error;
+    }
+
+//--------------------------------------------------                
+
+core_error_e core_wlan_eapol_interface_c::update_completed_check_pmksa_cache_list(
+    core_type_list_c<network_id_c> & network_id_list )
+    {
+    DEBUG1( "core_wlan_eapol_interface_c::update_completed_check_pmksa_cache_list() - network_id_list.count() = %i", network_id_list.count() );
+    
+    completed_check_pmksa_cache_list.clear();
+    
+    network_id_list.first();
+    while ( network_id_list.current() )
+        {
+        if ( network_id_list.current()->source_ptr )
+            {
+            DEBUG( "core_wlan_eapol_interface_c::update_completed_check_pmksa_cache_list() - Adding mac address to completed_check_pmksa_cache_list" );
+            core_mac_address_s * mac = new core_mac_address_s(
+                network_id_list.current()->source() );
+            if ( !mac )
+                {
+                DEBUG( "core_wlan_eapol_interface_c::update_completed_check_pmksa_cache_list() - new core_mac_address_s failed" );
+                return core_error_no_memory;
+                }
+
+            core_error_e error = completed_check_pmksa_cache_list.append( mac );
+            if ( error != core_error_ok )
+                {
+                delete mac;
+                mac = NULL;
+                DEBUG1( "core_wlan_eapol_interface_c::update_completed_check_pmksa_cache_list() - completed_check_pmksa_cache_list.append( mac ) failed with code %i", error );
+                return error;
+                }
+            }
+        else
+            {
+            DEBUG( "core_wlan_eapol_interface_c::update_completed_check_pmksa_cache_list() - source == NULL" );
+            }
+    
+        network_id_list.next();
+        }
+    
+    DEBUG1( "core_wlan_eapol_interface_c::update_completed_check_pmksa_cache_list() - completed_check_pmksa_cache_list.count() %i", completed_check_pmksa_cache_list.count() );
+    return core_error_ok;
+    }
+
+//--------------------------------------------------                
+
+core_type_list_c<core_mac_address_s> & core_wlan_eapol_interface_c::get_completed_check_pmksa_cache_list()
+    {
+    return completed_check_pmksa_cache_list;
+    }
+
+//--------------------------------------------------                
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+core_error_e core_wlan_eapol_interface_c::store_frame(
+    const core_frame_ethernet_c& frame )
+    {
+    DEBUG( "core_wlan_eapol_interface_c::store_frame()" );
+    
+    if ( stored_frame_m )
+        {
+        DEBUG( "core_wlan_eapol_interface_c::store_frame() - deleting previously stored frame" );
+
+        delete stored_frame_m;
+        stored_frame_m = NULL;
+        }
+
+    stored_frame_m = core_frame_ethernet_c::instance(
+        frame.data_length(), frame.data(), true_t );
+    if ( !stored_frame_m )
+        {
+        DEBUG( "core_wlan_eapol_interface_c::store_frame() - unable to copy the frame" );
+
+        return core_error_no_memory;
+        }
+
+    return core_error_ok;
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void core_wlan_eapol_interface_c::clear_stored_frame()
+    {
+    delete stored_frame_m;
+    stored_frame_m = NULL;   
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+core_error_e core_wlan_eapol_interface_c::process_stored_frame()
+    {
+    if ( !stored_frame_m )
+        {
+        DEBUG( "core_wlan_eapol_interface_c::store_frame() - no stored frame" );
+        
+        return core_error_ok;
+        }
+
+    core_error_e ret = process_frame( *stored_frame_m );
+    clear_stored_frame();
+
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+core_eapol_operating_mode_e core_wlan_eapol_interface_c::operating_mode() const
+    {
+    return eapol_mode_m;
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+wlan_eapol_ethernet_type_e core_wlan_eapol_interface_c::ethernet_type() const
+    {
+    if( eapol_mode_m == core_eapol_operating_mode_wapi )
+        {
+        return wlan_eapol_ethernet_type_wapi;
+        }
+
+    return wlan_eapol_ethernet_type_pae;
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+wlan_eapol_if_eapol_key_authentication_type_e core_wlan_eapol_interface_c::authentication_type() const
+    {
+    return authentication_type_m;
+    }
+
+// End of file