wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_connection_data.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 02:03:13 +0200
changeset 0 c40eb8fe8501
child 17 a828660c511c
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2005-2009 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 holding all connection related data
*
*/

/*
* %version: 37 %
*/

#include "core_connection_data.h"
#include "core_tools.h"
#include "am_debug.h"

const u8_t CORE_FAILURE_NONE = 0;

// ======== MEMBER FUNCTIONS ========

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//   
core_connection_data_c::core_connection_data_c(
    const core_iap_data_s& iap_data,
    const core_device_settings_s& device_settings ) :
    iap_data_m( iap_data ),
    device_settings_m( device_settings ),
    connect_status_m( core_connect_undefined ),
    previous_ap_m( NULL ),
    current_ap_m( NULL ),
    ssid_m( BROADCAST_SSID ),
    temp_blacklist_m( ),
    last_rcp_class_m( core_rcp_normal ),
    last_tx_level_m( MAX_TX_POWER_LEVEL_NOT_DEFINED ),
    last_bssid_m( ZERO_MAC_ADDR ),
    last_connection_state_m( core_connection_state_notconnected ),
    association_failure_count_m( ),
    deauthentication_count_m( ),
    last_eap_type_m( EAP_TYPE_NONE ),
    last_eap_error_code_m( EAP_ERROR_NONE ),
    adjacent_ap_channels_m( ),
    is_eapol_authentication_started_m( false_t ),
    is_eapol_authenticating_m( false_t ),
    eapol_auth_bssid_m( ZERO_MAC_ADDR ),
    traffic_stream_list_m( ),
    virtual_traffic_stream_list_m( ),
    is_eapol_connecting_m( false_t ),
    is_disconnecting_m( false_t ),
    last_roam_reason_m( core_roam_reason_none ),
    last_roam_failed_reason_m( core_roam_failed_reason_none ),
    is_eapol_require_immediate_reconnect_m( false_t ),
    is_voice_call_on_m( false_t ),
    previous_rrm_measurement_request_time_m( 0 )
    {
    DEBUG( "core_connection_data_c::core_connection_data_c()" );

    for( u8_t idx( 0 ); idx < MAX_QOS_ACCESS_CLASS; ++idx )
        {
        ac_traffic_status_m[idx] = core_access_class_traffic_status_admitted;
        ac_traffic_mode_m[idx] = core_access_class_traffic_mode_automatic;
        }
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_connection_data_c::~core_connection_data_c()
    {
    DEBUG( "core_connection_data_c::~core_connection_data_c()" );
    delete current_ap_m;
    delete previous_ap_m;
    temp_blacklist_m.clear();
    association_failure_count_m.clear();
    deauthentication_count_m.clear();
    power_save_test_verdict_m.clear();
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//   
core_iap_data_c& core_connection_data_c::iap_data()
    {
    return iap_data_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//   
core_connect_status_e core_connection_data_c::connect_status() const
    {
    return connect_status_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//   
void core_connection_data_c::set_connect_status(
    core_connect_status_e connect_status )
    {
    connect_status_m = connect_status;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//   
void core_connection_data_c::set_current_ap_data(
    const core_ap_data_c& ap_data )
    {
    DEBUG( "core_connection_data_c::set_current_ap_data()" );
    
    delete current_ap_m;
    current_ap_m = NULL;
    
    current_ap_m = core_ap_data_c::instance( ap_data );
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_ap_data_c* core_connection_data_c::current_ap_data()
    {
    return current_ap_m;
    }


// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::set_previous_ap_data(
    const core_ap_data_c& ap_data )
    {
    delete previous_ap_m;
    previous_ap_m = NULL;
    
    previous_ap_m = core_ap_data_c::instance( ap_data );
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_ap_data_c* core_connection_data_c::previous_ap_data()
    {
    return previous_ap_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
const core_ssid_s& core_connection_data_c::ssid() const
    {
    return ssid_m;
    }
    
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::set_ssid(
    const core_ssid_s& ssid )
    {
    ssid_m = ssid;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
bool_t core_connection_data_c::is_mac_in_temporary_blacklist(
    const core_mac_address_s& mac )
    {
    core_ap_blacklist_entry_s* addr = temp_blacklist_m.first();    
    while ( addr )
        {
        if ( addr->bssid == mac )
            {
            return true_t;
            }
        
        addr = temp_blacklist_m.next();
        }        

    return false_t;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::add_mac_to_temporary_blacklist(
    const core_mac_address_s& mac,
    core_ap_blacklist_reason_e reason )
    {
    if ( !is_mac_in_temporary_blacklist( mac ) )
        {
        core_ap_blacklist_entry_s* entry = new core_ap_blacklist_entry_s;
        if ( entry )
            {
            entry->bssid = mac;
            entry->reason = reason;
            temp_blacklist_m.append( entry );
            }
        }
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::remove_mac_from_temporary_blacklist(
    const core_mac_address_s& mac )
    {
    core_ap_blacklist_entry_s* addr = temp_blacklist_m.first();    
    while ( addr )
        {
        if ( addr->bssid == mac )
            {
            temp_blacklist_m.remove( addr );
            delete addr;
            addr = NULL;

            return;
            }
        
        addr = temp_blacklist_m.next();
        }       
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_type_list_c<core_ap_blacklist_entry_s>& core_connection_data_c::temporary_blacklist()
    {
    return temp_blacklist_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::remove_temporary_blacklist_entries(
    u32_t reasons )
    {
    core_ap_blacklist_entry_s* addr = temp_blacklist_m.first();    
    while( addr )
        {
        if( reasons & addr->reason )
            {
            DEBUG6( "core_connection_data_c::remove_temporary_blacklist_entries() - removing entry with BSSID %02X:%02X:%02X:%02X:%02X:%02X",
                addr->bssid.addr[0], addr->bssid.addr[1], addr->bssid.addr[2], 
                addr->bssid.addr[3], addr->bssid.addr[4], addr->bssid.addr[5] );

            temp_blacklist_m.remove( addr );
            delete addr;
            addr = NULL;

            return;
            }

        addr = temp_blacklist_m.next();
        }
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_rcp_class_e core_connection_data_c::last_rcp_class() const
    {
    return last_rcp_class_m;  
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//   
void core_connection_data_c::set_last_rcp_class(
    core_rcp_class_e type )
    {
    last_rcp_class_m = type;
    };

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//   
u32_t core_connection_data_c::last_tx_level() const
    {
    return last_tx_level_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//      
void core_connection_data_c::set_last_tx_level(
    u32_t tx_level )
    {
    last_tx_level_m = tx_level;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
const core_mac_address_s& core_connection_data_c::last_bssid() const
    {
    return last_bssid_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::set_last_bssid(
    const core_mac_address_s& bssid )
    {
    last_bssid_m = bssid;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_connection_state_e core_connection_data_c::connection_state() const
    {
    core_operating_mode_e mode =
        iap_data_m.operating_mode();
        
    if( mode == core_operating_mode_ibss )
        {
        if( iap_data_m.security_mode() == core_security_mode_allow_unsecure )
            {
            return core_connection_state_ibss;
            }
        else
            {
            return core_connection_state_secureibss;
            }
        }
    else
        {
        if( iap_data_m.security_mode() == core_security_mode_allow_unsecure )
            {
            return core_connection_state_infrastructure;
            }
        else
            {
            return core_connection_state_secureinfra;
            }
        }
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_connection_state_e core_connection_data_c::last_connection_state() const
    {
    return last_connection_state_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::set_last_connection_state(
    core_connection_state_e state )
    {
    last_connection_state_m = state;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
u8_t core_connection_data_c::ap_association_failure_count(
    const core_mac_address_s& bssid )
    {    
    core_ap_failure_count_s* iter = association_failure_count_m.first();    
    while ( iter )
        {
        if ( iter->bssid == bssid )
            {
            return iter->count;
            }

        iter = association_failure_count_m.next();
        }

    return CORE_FAILURE_NONE;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::increase_ap_association_failure_count(
    const core_mac_address_s& bssid )
    {
    core_ap_failure_count_s* iter = association_failure_count_m.first();    
    while ( iter )
        {
        if ( iter->bssid == bssid )
            {
            iter->count++;
            return;
            }

        iter = association_failure_count_m.next();
        }

    iter = new core_ap_failure_count_s;
    if ( iter )
        {
        iter->bssid = bssid;
        iter->count = CORE_FAILURE_NONE + 1;
        association_failure_count_m.append( iter );
        }
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::clear_ap_association_failure_count(
    const core_mac_address_s& bssid )
    {
    core_ap_failure_count_s* iter = association_failure_count_m.first();    
    while ( iter )
        {
        if ( iter->bssid == bssid )
            {
            DEBUG1( "core_connection_data_c::clear_ap_failure_count() - this AP had %u previous failures",
                iter->count );

            association_failure_count_m.remove( iter );

            delete iter;
            iter = NULL;

            return;
            }

        iter = association_failure_count_m.next();
        }

    DEBUG( "core_connection_data_c::clear_ap_failure_count() - this AP had no previous failures" );
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
u8_t core_connection_data_c::ap_authentication_failure_count(
    const core_mac_address_s& bssid )
    {    
    core_ap_auth_failure_count_s* iter = authentication_failure_count_m.first();    
    while ( iter )
        {
        if ( iter->bssid == bssid )
            {
            return iter->count;
            }

        iter = authentication_failure_count_m.next();
        }

    return CORE_FAILURE_NONE;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::increase_ap_authentication_failure_count(
    const core_mac_address_s& bssid )
    {
    core_ap_auth_failure_count_s* iter = authentication_failure_count_m.first();    
    while ( iter )
        {
        if ( iter->bssid == bssid )
            {
            iter->count++;
            return;
            }

        iter = authentication_failure_count_m.next();
        }

    iter = new core_ap_auth_failure_count_s;
    if ( iter )
        {
        iter->bssid = bssid;
        iter->count = CORE_FAILURE_NONE + 1;
        authentication_failure_count_m.append( iter );
        }
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::clear_all_authentication_failure_counts()
    {
    DEBUG( "core_connection_data_c::clear_all_authentication_failure_counts()" );
    
    core_ap_auth_failure_count_s* iter = authentication_failure_count_m.first();    
    while ( iter )
        {
        DEBUG1( "core_connection_data_c::clear_all_authentication_failure_counts() - this AP had %u previous failures",
            iter->count );

        authentication_failure_count_m.remove( iter );

        delete iter;
        iter = NULL;
            
        iter = authentication_failure_count_m.next();
        }

    }


// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
u8_t core_connection_data_c::ap_deauthentication_count(
    const core_mac_address_s& bssid )
    {
    core_ap_failure_count_s* iter = deauthentication_count_m.first();    
    while ( iter )
        {
        if ( iter->bssid == bssid )
            {
            return iter->count;
            }

        iter = deauthentication_count_m.next();
        }

    return CORE_FAILURE_NONE;    
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::increase_ap_deauthentication_count(
    const core_mac_address_s& bssid )
    {
    core_ap_failure_count_s* iter = deauthentication_count_m.first();    
    while ( iter )
        {
        if ( iter->bssid == bssid )
            {
            iter->count++;
            return;
            }

        iter = deauthentication_count_m.next();
        }

    iter = new core_ap_failure_count_s;
    if ( iter )
        {
        iter->bssid = bssid;
        iter->count = CORE_FAILURE_NONE + 1;
        deauthentication_count_m.append( iter );
        }    
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
u32_t core_connection_data_c::last_failed_eap_type() const
    {
    return last_eap_type_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::set_last_failed_eap_type(
    u32_t type )
    {
    last_eap_type_m = type;   
    }
    
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//  
u32_t core_connection_data_c::last_eap_error() const
    {
    return last_eap_error_code_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::set_last_eap_error(
    u32_t error )
    {
    last_eap_error_code_m = error;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
const core_scan_channels_c& core_connection_data_c::adjacent_ap_channels() const
    {
    return adjacent_ap_channels_m; 
    }
    
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::set_adjacent_ap_channels(
    const core_scan_channels_c& channels )
    {
    adjacent_ap_channels_m.set( channels );
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::merge_adjacent_ap_channels(
    const core_scan_channels_c& channels )
    {
    adjacent_ap_channels_m.merge( channels );
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
bool_t core_connection_data_c::is_eapol_authentication_started() const
    {
    return is_eapol_authentication_started_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::set_eapol_authentication_started(
    bool_t is_authentication_started )
    {
    is_eapol_authentication_started_m = is_authentication_started;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
bool_t core_connection_data_c::is_eapol_authenticating() const
    {
    return is_eapol_authenticating_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::set_eapol_authenticating(
    bool_t is_authenticating )
    {
    is_eapol_authenticating_m = is_authenticating;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
const core_mac_address_s& core_connection_data_c::eapol_auth_bssid() const
    {
    return eapol_auth_bssid_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::set_eapol_auth_bssid(
    const core_mac_address_s& bssid )
    {
    eapol_auth_bssid_m = bssid;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_traffic_stream_list_c& core_connection_data_c::traffic_stream_list()
    {
    return traffic_stream_list_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_virtual_traffic_stream_list_c& core_connection_data_c::virtual_traffic_stream_list()
    {
    return virtual_traffic_stream_list_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
bool_t core_connection_data_c::is_eapol_connecting() const
    {
    return is_eapol_connecting_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::set_eapol_connecting(
    bool_t is_eapol_connecting )
    {
    is_eapol_connecting_m = is_eapol_connecting;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
bool_t core_connection_data_c::is_disconnecting() const
    {
    return is_disconnecting_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::set_disconnecting(
    bool_t is_disconnecting )
    {
    is_disconnecting_m = is_disconnecting;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
const core_rcpi_roam_interval_s& core_connection_data_c::rcpi_roam_interval() const
    {
    return rcpi_roam_interval_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::reset_rcpi_roam_interval()
    {
    rcpi_roam_interval_m.count = 0;
    rcpi_roam_interval_m.interval = device_settings_m.rcpi_roam_min_interval;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::set_core_rcpi_roam_interval(
    const core_rcpi_roam_interval_s& interval )
    {
    rcpi_roam_interval_m = interval;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//    
core_roam_reason_e core_connection_data_c::last_roam_reason() const
    {
    return last_roam_reason_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//    
void core_connection_data_c::set_last_roam_reason(
    core_roam_reason_e reason )
    {
    last_roam_reason_m = reason;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//    
core_roam_failed_reason_e core_connection_data_c::last_roam_failed_reason() const
    {
    return last_roam_failed_reason_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//    
void core_connection_data_c::set_last_roam_failed_reason(
    core_roam_failed_reason_e reason )
    {
    last_roam_failed_reason_m = reason;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
bool_t core_connection_data_c::is_ap_power_save_test_run(
    const core_mac_address_s& bssid,
    bool_t& is_success )
    {
    core_ap_power_save_test_verdict_s* iter = power_save_test_verdict_m.first();
    while ( iter )
        {
        if ( iter->bssid == bssid )
            {
            is_success = iter->is_success;

            return true_t;
            }

        iter = power_save_test_verdict_m.next();
        }

    return false_t;    
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::add_ap_power_save_test_verdict(
    const core_mac_address_s& bssid,
    bool_t is_success )
    {
    core_ap_power_save_test_verdict_s* iter = new core_ap_power_save_test_verdict_s;
    if ( iter )
        {
        iter->bssid = bssid;
        iter->is_success = is_success;

        power_save_test_verdict_m.append( iter );
        }
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
bool_t core_connection_data_c::is_eapol_require_immediate_reconnect() const
    {
    return is_eapol_require_immediate_reconnect_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::set_eapol_require_immediate_reconnect(
    bool_t is_immediate_reconnect_required )
    {
    is_eapol_require_immediate_reconnect_m = is_immediate_reconnect_required;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
bool_t core_connection_data_c::voice_call_state() const
    {
    DEBUG1( "core_connection_data_c::voice_call_state() - returning %u", is_voice_call_on_m );
    return is_voice_call_on_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::set_voice_call_state( const bool_t& is_voice_call_on ) 
    {
    DEBUG1( "core_connection_data_c::set_voice_call_state( %u )", is_voice_call_on );
    is_voice_call_on_m = is_voice_call_on;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
const u64_t& core_connection_data_c::get_previous_rrm_measurement_request_time() const
    {
    return previous_rrm_measurement_request_time_m;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::set_previous_rrm_measurement_request_time( const u64_t& timestamp)
    {
    previous_rrm_measurement_request_time_m = timestamp;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_access_class_traffic_status_e core_connection_data_c::ac_traffic_status(
    core_access_class_e access_class ) const
    {
    return ac_traffic_status_m[access_class];
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void core_connection_data_c::set_ac_traffic_status(
    core_access_class_e access_class,
    core_access_class_traffic_status_e status )
    {
    ac_traffic_status_m[access_class] = status;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_access_class_traffic_mode_e core_connection_data_c::ac_traffic_mode(
    core_access_class_e access_class ) const
    {
    return ac_traffic_mode_m[access_class];
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//   
void core_connection_data_c::set_ac_traffic_mode(
    core_access_class_e access_class,
    core_access_class_traffic_mode_e mode )
    {
    ac_traffic_mode_m[access_class] = mode;
    }