diff -r 000000000000 -r c40eb8fe8501 wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_connection_data.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_connection_data.cpp Tue Feb 02 02:03:13 2010 +0200 @@ -0,0 +1,909 @@ +/* +* 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_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; + }