# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1277131380 -10800 # Node ID 13838cf40350ff550fe979ba45f8193e0472b02c # Parent af3fb27c7511a7183591d11ba70df184affcf623 Revision: 201023 Kit: 2010125 diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/inc/abs_core_server.h --- a/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/inc/abs_core_server.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/inc/abs_core_server.h Mon Jun 21 17:43:00 2010 +0300 @@ -17,7 +17,7 @@ */ /* -* %version: 31 % +* %version: 32 % */ #ifndef ABS_CORE_SERVER_H @@ -106,7 +106,7 @@ * @param request_id An unique identification for the request. * @param is_active_scan_allowed specifies whether active scanning is allowed. * @param iap_data_list containing list of iap data structures. - * @param iap_id_list list of iap ids are stored here on completion. + * @param iap_availability_list List of available IAPs. * @param iap_ssid_list List of possible secondary SSIDs. * @param scan_data contains the scan results */ @@ -114,7 +114,7 @@ u32_t request_id, bool_t is_active_scan_allowed, core_type_list_c& iap_data_list, - core_type_list_c& iap_id_list, + core_type_list_c& iap_availability_list, core_type_list_c* iap_ssid_list, ScanList& scan_data ) = 0; diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/inc/core_operation_get_available_iaps.h --- a/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/inc/core_operation_get_available_iaps.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/inc/core_operation_get_available_iaps.h Mon Jun 21 17:43:00 2010 +0300 @@ -15,6 +15,9 @@ * */ +/* +* %version: 18 % +*/ #ifndef CORE_OPERATION_GET_AVAILABLE_IAPS_H #define CORE_OPERATION_GET_AVAILABLE_IAPS_H @@ -43,6 +46,9 @@ public: + /** + * The possible states of the state machine. + */ enum core_state_e { core_state_init = core_base_state_next, @@ -64,12 +70,6 @@ core_state_MAX }; - struct core_scan_list_entry - { - core_mac_address_s bssid; - core_ssid_s ssid; - }; - /** * Constructor. * @@ -80,9 +80,9 @@ * @param adaptation pointer to upper adaptation * @param is_active_scan_allowed specifies whether to use probes or just listen to beacons * @param iap_data_list contains list of IAP data structures - * @param iap_ssid_list List of possible secondary SSIDs - * @param list of available IAP IDs on return - * @param scan data of found networks on return + * @param iap_availability_list List of available IAPs. + * @param iap_ssid_list List of possible secondary SSIDs. + * @param scan_data scan data of found networks on return */ core_operation_get_available_iaps_c( u32_t request_id, @@ -91,7 +91,7 @@ abs_core_server_callback_c* adaptation, bool_t is_active_scan_allowed, core_type_list_c& iap_data_list, - core_type_list_c& iap_id_list, + core_type_list_c& iap_availability_list, core_type_list_c* iap_ssid_list, ScanList& scan_data ); @@ -147,11 +147,6 @@ private: // functions /** - * Remove IAPs that are not marked hidden from the list of IAPs to search. - */ - void remove_non_hidden_iaps(); - - /** * Process the scan results using the given tag. * * @param tag Tag to use for iterating through the scan results. @@ -210,6 +205,39 @@ const core_ssid_s& ssid, const ScanList& scan_data ); + /** + * Check whether the given SSID is present in the SSID list. + * + * @param ssid SSID to match. + * @param ssid_list SSID list to search. + * @return true_t if matching SSID is found, false_t otherwise. + */ + bool_t is_ssid_in_list( + const core_ssid_s& ssid, + core_type_list_c& ssid_list ) const; + + /** + * Check whether the given IAP is present in the IAP availability list. + * + * @param iap_id IAP ID to match. + * @param iap_list IAP availability list to search. + * @return true_t if matching IAP is found, false_t otherwise. + */ + bool_t is_iap_in_availability_list( + u32_t iap_id, + core_type_list_c& iap_list ) const; + + /** + * Add the given IAP to the IAP availability list. If an entry already exists, + * only signal strength is updated if needed. + * + * @param iap_id IAP ID to add. + * @param iap_rcpi Signal strength of the IAP. + */ + void update_iap_availability( + u32_t iap_id, + u8_t iap_rcpi ); + private: // data /** @@ -223,14 +251,19 @@ bool_t is_limiting_algorithm_used_m; /** - * Original list of IAPs. + * Number of IAPs. + */ + u32_t iap_data_count_m; + + /** + * List of IAPs. */ core_type_list_c& iap_data_list_m; /** - * List for storing IDs of available IAPs. + * List of available IAPs. */ - core_type_list_c& iap_id_list_m; + core_type_list_c& iap_availability_list_m; /** * List of possible secondary SSIDs. Not owned by this pointer. @@ -273,9 +306,14 @@ u8_t bss_count_m; /** - * SSID being direct scanned. + * List of SSIDs to direct scan. */ - core_ssid_s direct_scanned_ssid_m; + core_type_list_c direct_scan_list_m; + + /** + * Iterator for direct scan list. + */ + core_type_list_iterator_c direct_scan_iter_m; /** * Region information that is selected based on the APs country information. diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/inc/core_server.h --- a/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/inc/core_server.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/inc/core_server.h Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 55 % +* %version: 56 % */ #ifndef CORE_SERVER_H @@ -501,7 +501,7 @@ * @param request_id An unique identification for the request. * @param is_active_scan_allowed specifies whether active scanning is allowed. * @param iap_data_list containing list of iap data structures. - * @param iap_id_list list of iap ids are stored here on completion. + * @param iap_availability_list List of available IAPs. * @param iap_ssid_list List of possible secondary SSIDs. * @param scan_data contains the scan results */ @@ -509,7 +509,7 @@ u32_t request_id, bool_t is_active_scan_allowed, core_type_list_c& iap_data_list, - core_type_list_c& iap_id_list, + core_type_list_c& iap_availability_list, core_type_list_c* iap_ssid_list, ScanList& scan_data ); diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/inc/core_settings.h --- a/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/inc/core_settings.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/inc/core_settings.h Mon Jun 21 17:43:00 2010 +0300 @@ -15,6 +15,9 @@ * */ +/* +* %version: 21 % +*/ #ifndef CORE_SETTINGS_H #define CORE_SETTINGS_H @@ -444,31 +447,6 @@ */ void set_block_ack_usage( const core_block_ack_usage_s& usage ); - - /** - * Add a IAP ID to the weaklist. - * - * @since S60 v5.2 - * @param iap_id IAP ID to be added. - */ - void add_iap_id_to_weak_iap_list(u32_t iap_id); - - /** - * Check whether the given IAP ID is weaklisted. - * - * @since S60 v5.2 - * @param iap_id IAP ID to be checked. - * @return Whether the given IAP ID is weaklisted. - */ - bool_t is_iap_id_in_weak_list( u32_t iap_id ); - - /** - * Remove a IAP ID from the weaklist. - * - * @since S60 v5.2 - * @param iap_id IAP ID to be removed. - */ - void remove_iap_id_from_weak_list( u32_t iap_id ); /** * Set the currently enabled feature set. @@ -554,9 +532,6 @@ /** Block ACK usage per traffic stream. */ core_block_ack_usage_s block_ack_usage_m; - /** List of IAP Ids whose rcpi values are weak */ - core_type_list_c weak_iap_list_m; - /** Bitmask of enabled features. */ u32_t features_m; diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/inc/core_types.h --- a/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/inc/core_types.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/inc/core_types.h Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 97 % +* %version: 99 % */ #ifndef CORE_TYPES_H @@ -468,6 +468,7 @@ core_error_wlan_disabled, core_error_already_exists, core_error_eapol_auth_start_timeout, + core_error_unsupported_config } core_error_e; /** @@ -597,6 +598,7 @@ core_connect_ap_signal_too_weak, core_connect_ap_has_no_admission_control, core_connect_ap_has_no_free_admission_capability, + core_connect_ap_unsupported_configuration, core_connect_iap_open_but_ap_requires_encryption, core_connect_iap_wep_but_ap_has_no_privacy, core_connect_iap_wep_but_ap_has_wpa_ie, @@ -796,7 +798,6 @@ { core_management_status_success = 0, core_management_status_unspecified_failure = 1, - // 2 - 9 are reserved. core_management_status_unsupported_capabilities = 10, core_management_status_reassociation_denied_other = 11, core_management_status_association_denied_other = 12, @@ -809,10 +810,10 @@ core_management_status_assoc_unsup_short_preamble = 19, core_management_status_assoc_unsup_pbcc = 20, core_management_status_assoc_unsup_channel_agility = 21, - // 22 - 24 reserved. core_management_status_assoc_unsup_short_slot_time = 25, - core_management_status_assoc_unsup_dsss_ofdm = 26 - // 27 - 65,535 reserved + core_management_status_assoc_unsup_dsss_ofdm = 26, + core_management_status_assoc_unsup_ht_features = 27, + core_management_status_assoc_unsup_pco = 29 } core_management_status_e; /** @@ -1558,6 +1559,17 @@ }; /** + * Structure for storing IAP availability data. + */ +struct core_iap_availability_data_s + { + /** ID of the IAP. */ + u32_t id; + /** Signal strength of the strongest AP in the network. */ + u8_t rcpi; + }; + +/** * Struct containing SSIDs related to secondary SSID feature. */ struct core_ssid_entry_s diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_operation_check_rcpi.cpp --- a/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_operation_check_rcpi.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_operation_check_rcpi.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 22 % +* %version: 23 % */ #include "core_operation_check_rcpi.h" @@ -365,13 +365,7 @@ u8_t buf[5]; buf[0] = static_cast( core_rcp_weak ); buf[1] = static_cast( current_rcpi_m ); - - /** - * Get current IAP Id value and add it to the weak list. - */ - server_m->get_core_settings().add_iap_id_to_weak_iap_list( - server_m->get_connection_data()->iap_data().iap_id()); - + adaptation_m->notify( core_notification_rcp_changed, sizeof( buf ), diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_operation_get_available_iaps.cpp --- a/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_operation_get_available_iaps.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_operation_get_available_iaps.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 41 % +* %version: 44 % */ #include "core_operation_get_available_iaps.h" @@ -27,10 +27,9 @@ #include "core_frame_dot11_ie.h" #include "am_debug.h" -/** Defining this enables IAP related traces. */ -//#define WLAN_CORE_DEEP_DEBUG 1 - -/** The channel time used in the long passive scan. */ +/** + * The channel time used in the long passive scan. + */ const u32_t LONG_PASSIVE_SCAN_CHANNEL_TIME = 210; /** @@ -51,24 +50,24 @@ abs_core_server_callback_c* adaptation, bool_t is_active_scan_allowed, core_type_list_c& iap_data_list, - core_type_list_c& iap_id_list, + core_type_list_c& iap_availability_list, core_type_list_c* iap_ssid_list, ScanList& scan_data ) : core_operation_base_c( core_operation_get_available_iaps, request_id, server, drivers, adaptation, core_base_flag_drivers_needed ), is_active_scan_allowed_m( is_active_scan_allowed ), is_limiting_algorithm_used_m( false_t ), + iap_data_count_m( iap_data_list.count() ), iap_data_list_m( iap_data_list ), - iap_id_list_m( iap_id_list ), + iap_availability_list_m( iap_availability_list ), iap_ssid_list_m( iap_ssid_list ), client_scan_data_m( scan_data ), active_channels_m( ), broadcast_channels_m( ), long_broadcast_count_m( 0 ), - non_found_iaps_list_m( ), is_split_scan_m( false_t ), bss_count_m( 0 ), - direct_scanned_ssid_m( ), + direct_scan_iter_m( direct_scan_list_m ), region_from_ap_m( core_wlan_region_fcc ) { DEBUG( "core_operation_get_available_iaps_c::core_operation_get_available_iaps_c()" ); @@ -83,7 +82,7 @@ server_m->unregister_event_handler( this ); server_m->unregister_frame_handler( this ); - non_found_iaps_list_m.clear(); + direct_scan_list_m.clear(); iap_ssid_list_m = NULL; } @@ -103,15 +102,13 @@ #ifdef WLAN_CORE_DEEP_DEBUG DEBUG( "core_operation_get_available_iaps_c::next_state() - IAP data list:" ); - core_iap_data_s* iter_data = iap_data_list_m.first(); - while( iter_data ) + core_type_list_iterator_c iap_data_iter( iap_data_list_m ); + for( core_iap_data_s* entry = iap_data_iter.first(); entry; entry = iap_data_iter.next() ) { DEBUG1( "core_operation_get_available_iaps_c::next_state() - ID: %u", - iter_data->id ); + entry->id ); DEBUG1S( "core_operation_get_available_iaps_c::next_state() - SSID: ", - iter_data->ssid.length, iter_data->ssid.ssid ); - - iter_data = iap_data_list_m.next(); + entry->ssid.length, entry->ssid.ssid ); } if ( iap_ssid_list_m ) @@ -257,7 +254,6 @@ const core_scan_channels_s channels( server_m->get_core_settings().valid_scan_channels( broadcast_channels_m.channels() ) ); - if ( !is_active_scan_allowed_m || is_limiting_algorithm_used_m ) { @@ -322,7 +318,7 @@ * handled already */ return goto_state( core_state_broadcast_scan_done_handle_result ); } - + operation_state_m = core_state_broadcast_scan_start_unknown_region; broadcast_channels_m.set( @@ -472,7 +468,7 @@ } /** - * Go through the broadcast scan results and remove matching IAPs. + * Go through the broadcast scan results. */ process_scan_results( core_scan_list_tag_scan ); @@ -487,13 +483,37 @@ is_limiting_algorithm_used_m && bss_count_m ) ) { - remove_non_hidden_iaps(); + /** + * Gather a list of SSID to direct scan. Only IAPs marked + * as hidden will be scanned. + */ + core_type_list_iterator_c iap_data_iter( iap_data_list_m ); + for( core_iap_data_s* entry = iap_data_iter.first(); entry; entry = iap_data_iter.next() ) + { + if( entry->is_hidden && + !is_ssid_in_list( + entry->ssid, + direct_scan_list_m ) ) + { + core_ssid_s* ssid = new core_ssid_s; + if( ssid ) + { + *ssid = entry->ssid; + core_error_e ret = direct_scan_list_m.append( ssid ); + if( ret != core_error_ok ) + { + delete ssid; + } + ssid = NULL; + } + } + } /** * If limiting algorithm is used, only the current active_channels_m * will be used. */ - if ( is_limiting_algorithm_used_m ) + if( is_limiting_algorithm_used_m ) { DEBUG( "core_operation_get_available_iaps_c::next_state() - limiting channels based on WLAN activity" ); } @@ -503,27 +523,18 @@ server_m->get_core_settings().all_valid_scan_channels() ); } - /** - * iap_data_list_m now contains only hidden ssid IAPs, - * that will be direct scanned next. - */ - core_iap_data_s* iap = iap_data_list_m.first(); - if( !iap ) + core_ssid_s* ssid = direct_scan_iter_m.first(); + if( !ssid ) { DEBUG( "core_operation_get_available_iaps_c::next_state() - nothing to direct scan" ); - /** No hidden IAP entries in the request, move on.. */ return goto_state( core_state_secondary_ssid_check ); } - DEBUG1( "core_operation_get_available_iaps_c::next_state() - going to direct scan %u IAP(s)", - iap_data_list_m.count() ); - - direct_scanned_ssid_m = iap->ssid; - DEBUG1( "core_operation_get_available_iaps_c::next_state() - direct scanning IAP ID %u", - iap->id ); - DEBUG1S( "core_operation_get_available_iaps_c::next_state() - SSID: ", - direct_scanned_ssid_m.length, direct_scanned_ssid_m.ssid ); + DEBUG1( "core_operation_get_available_iaps_c::next_state() - going to direct scan %u SSID(s)", + direct_scan_list_m.count() ); + DEBUG1S( "core_operation_get_available_iaps_c::next_state() - direct scanning SSID: ", + ssid->length, &ssid->ssid[0] ); server_m->get_scan_list().set_tag( core_scan_list_tag_direct_scan ); @@ -542,7 +553,7 @@ drivers_m->scan( request_id_m, core_scan_mode_active, - direct_scanned_ssid_m, + *ssid, server_m->get_device_settings().scan_rate, channels, server_m->get_device_settings().active_scan_min_ch_time, @@ -554,7 +565,6 @@ else { DEBUG( "core_operation_get_available_iaps_c::next_state() - no reason to direct scan anything" ); - remove_non_hidden_iaps(); return goto_state( core_state_scanning_done ); } @@ -571,8 +581,6 @@ DEBUG1( "core_operation_get_available_iaps_c::next_state() - direct scan done, %u beacon(s)/probe(s) received", bss_count_m ); - DEBUG1( "core_operation_get_available_iaps_c::next_state() - max %u direct scans left", - iap_data_list_m.count() ); /** * Go through the direct scan results and remove the matching IAPs. @@ -580,101 +588,70 @@ process_scan_results( core_scan_list_tag_direct_scan ); - /** - * If the first entry is still the same the one that was scanned, - * it means the IAP was not found. - */ - core_iap_data_s* iap = iap_data_list_m.first(); - if ( iap && iap->ssid == direct_scanned_ssid_m ) - { - DEBUG1( "core_operation_get_available_iaps_c::next_state() - IAP ID %u not found in direct scan", - iap->id ); - - core_error_e ret = iap_data_list_m.remove( iap ); - if( ret != core_error_ok ) - { - DEBUG1( "core_operation_get_available_iaps_c::next_state() - error while removing IAP entry (%d)", - ret ); - } - - non_found_iaps_list_m.append( iap ); - } - - iap = iap_data_list_m.first(); - if( iap ) - { - direct_scanned_ssid_m = iap->ssid; - DEBUG1( "core_operation_get_available_iaps_c::next_state() - direct scanning IAP ID %u", - iap->id ); - DEBUG1S( "core_operation_get_available_iaps_c::next_state() - SSID: ", - direct_scanned_ssid_m.length, direct_scanned_ssid_m.ssid ); - - server_m->get_scan_list().set_tag( - core_scan_list_tag_direct_scan ); - - const core_scan_channels_s& channels( - active_channels_m.channels() ); - DEBUG2( "core_operation_get_available_iaps_c::next_state() - requesting scan on channels 0x%02X%02X", - channels.channels2dot4ghz[1], - channels.channels2dot4ghz[0] ); - - bss_count_m = 0; - - server_m->register_event_handler( this ); - server_m->register_frame_handler( this ); - - drivers_m->scan( - request_id_m, - core_scan_mode_active, - direct_scanned_ssid_m, - server_m->get_device_settings().scan_rate, - channels, - server_m->get_device_settings().active_scan_min_ch_time, - server_m->get_device_settings().active_scan_max_ch_time, - is_split_scan_m ); - } - else + core_ssid_s* ssid = direct_scan_iter_m.next(); + if( !ssid ) { DEBUG( "core_operation_get_available_iaps_c::next_state() - nothing to direct scan" ); return goto_state( core_state_secondary_ssid_check ); } + DEBUG1S( "core_operation_get_available_iaps_c::next_state() - direct scanning SSID: ", + ssid->length, &ssid->ssid[0] ); + + server_m->get_scan_list().set_tag( + core_scan_list_tag_direct_scan ); + + const core_scan_channels_s& channels( + active_channels_m.channels() ); + DEBUG2( "core_operation_get_available_iaps_c::next_state() - requesting scan on channels 0x%02X%02X", + channels.channels2dot4ghz[1], + channels.channels2dot4ghz[0] ); + + bss_count_m = 0; + + server_m->register_event_handler( this ); + server_m->register_frame_handler( this ); + + drivers_m->scan( + request_id_m, + core_scan_mode_active, + *ssid, + server_m->get_device_settings().scan_rate, + channels, + server_m->get_device_settings().active_scan_min_ch_time, + server_m->get_device_settings().active_scan_max_ch_time, + is_split_scan_m ); + break; } case core_state_secondary_ssid_check: { - ASSERT( !iap_data_list_m.count() ); - ASSERT( !iap_data_list_m.first() ); - /** - * All the IAPs that were not found are contained in non_found_iaps_list_m - * list. Those that have secondary SSIDs defined, will be moved back to - * iap_data_list_m for scanning. + * Remove all IAPs that have either been found or don't have + * secondary SSID defined. */ - - if ( iap_ssid_list_m ) + if( iap_ssid_list_m ) { - core_iap_data_s* iap = non_found_iaps_list_m.first(); - while( iap ) + core_type_list_iterator_c iap_data_iter( iap_data_list_m ); + for( core_iap_data_s* entry = iap_data_iter.first(); entry; entry = iap_data_iter.next() ) { DEBUG1( "core_operation_get_available_iaps_c::next_state() - checking IAP ID %u for secondary SSIDs", - iap->id ); + entry->id ); - if ( is_id_in_secondary_ssid_list( iap->id ) ) + if( !is_iap_in_availability_list( + entry->id, + iap_availability_list_m ) && + is_id_in_secondary_ssid_list( + entry->id ) ) { DEBUG( "core_operation_get_available_iaps_c::next_state() - IAP has secondary SSID(s) defined" ); - - /** Using a temporary pointer to guarantee list iterator working. */ - core_iap_data_s* temp = iap; - iap = non_found_iaps_list_m.next(); - - non_found_iaps_list_m.remove( temp ); - iap_data_list_m.append( temp ); } else { - iap = non_found_iaps_list_m.next(); + iap_data_iter.remove(); + delete entry; + entry = NULL; } } } @@ -727,10 +704,8 @@ entry->ssid, client_scan_data_m ) ) { - direct_scanned_ssid_m = entry->used_ssid; - DEBUG1S( "core_operation_get_available_iaps_c::next_state() - matching SSID found, doing a direct scan for SSID ", - direct_scanned_ssid_m.length, direct_scanned_ssid_m.ssid ); + entry->used_ssid.length, entry->used_ssid.ssid ); server_m->get_scan_list().set_tag( core_scan_list_tag_direct_scan ); @@ -749,7 +724,7 @@ drivers_m->scan( request_id_m, core_scan_mode_active, - direct_scanned_ssid_m, + entry->used_ssid, server_m->get_device_settings().scan_rate, channels, server_m->get_device_settings().active_scan_min_ch_time, @@ -776,7 +751,8 @@ remove_secondary_ssid_entries_by_id( iap->id ); iap_data_list_m.remove( iap ); - non_found_iaps_list_m.append( iap ); + delete iap; + iap = NULL; (void)iap_ssid_list_m->first(); (void)iap_data_list_m.first(); @@ -799,7 +775,7 @@ core_scan_list_iterator_by_tag_and_ssid_c iter( server_m->get_scan_list(), core_scan_list_tag_direct_scan, - direct_scanned_ssid_m ); + entry->used_ssid ); for ( core_ap_data_c* ap_data = iter.first(); ap_data; ap_data = iter.next() ) { @@ -815,14 +791,9 @@ DEBUG1( "core_operation_get_available_iaps_c::next_state() - secondary SSID match for IAP ID %u", iap->id ); - u32_t* iap_id = new u32_t; - if( iap_id ) - { - *iap_id = iap->id; - iap_id_list_m.append( iap_id ); - iap_id = NULL; - } - + update_iap_availability( + iap_data.id(), + ap_data->rcpi() ); remove_secondary_ssid_entries_by_id( iap->id ); iap_data_list_m.remove( iap ); (void)iap_ssid_list_m->first(); @@ -836,7 +807,7 @@ } DEBUG1S( "core_operation_get_available_iaps_c::next_state() - no matching SSID ", - direct_scanned_ssid_m.length, direct_scanned_ssid_m.ssid ); + entry->used_ssid.length, entry->used_ssid.ssid ); (void)iap_ssid_list_m->next(); @@ -854,9 +825,9 @@ DEBUG1( "core_operation_get_available_iaps_c::next_state() - scan list size is %u bytes", client_scan_data_m.Size() ); DEBUG1( "core_operation_get_available_iaps_c::next_state() - %u IAP(s) found", - iap_id_list_m.count() ); + iap_availability_list_m.count() ); DEBUG1( "core_operation_get_available_iaps_c::next_state() - %u IAP(s) not found", - non_found_iaps_list_m.count() ); + iap_data_count_m - iap_availability_list_m.count() ); /** * Detect channels that have APs with long beacon intervals. @@ -950,41 +921,6 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- // -void core_operation_get_available_iaps_c::remove_non_hidden_iaps() - { - DEBUG("core_operation_get_available_iaps_c::remove_non_hidden_iaps()"); - - core_iap_data_s* iap = iap_data_list_m.first(); - while( iap ) - { - if( !iap->is_hidden ) - { - DEBUG1("core_operation_get_available_iaps_c::remove_non_hidden_iaps() - removing IAP ID %u", - iap->id ); - - core_iap_data_s* temp = iap; - iap = iap_data_list_m.next(); - core_error_e ret = iap_data_list_m.remove( temp ); - if( ret != core_error_ok ) - { - DEBUG1("core_operation_get_available_iaps_c::remove_non_hidden_iaps() - error while removing IAP entry (%d)", - ret ); - } - non_found_iaps_list_m.append( temp ); - } - else - { - DEBUG1("core_operation_get_available_iaps_c::remove_non_hidden_iaps() - leaving IAP ID %u", - iap->id ); - - iap = iap_data_list_m.next(); - } - } - } - -// --------------------------------------------------------------------------- -// --------------------------------------------------------------------------- -// void core_operation_get_available_iaps_c::process_scan_results( u8_t tag ) { @@ -1007,26 +943,17 @@ core_ap_data_c& ap_data ) { DEBUG( "core_operation_get_available_iaps_c::remove_matching_iaps()" ); - - if ( ap_data.rcpi() < server_m->get_device_settings().iap_availability_rcpi_threshold ) - { - DEBUG2( "core_operation_get_available_iaps_c::remove_matching_iaps() - AP not considered, signal too weak (%u vs %u)", - ap_data.rcpi(), server_m->get_device_settings().iap_availability_rcpi_threshold ); + + core_mac_address_s bssid = ap_data.bssid(); - return; - } - - u8_t treshold_val = - static_cast(server_m->get_core_settings().rcp_improve_boundary()); - /** - * Loop through the IAP list. + * Loop through the list of IAPs. */ - core_iap_data_s* iap = iap_data_list_m.first(); - while( iap ) + core_type_list_iterator_c iap_data_iter( iap_data_list_m ); + for( core_iap_data_s* entry = iap_data_iter.first(); entry; entry = iap_data_iter.next() ) { - core_iap_data_c iap_data( *iap ); - if ( iap->ssid == ap_data.ssid() && + core_iap_data_c iap_data( *entry ); + if ( iap_data.ssid() == ap_data.ssid() && core_tools_parser_c::is_ap_compatible_with_iap( server_m->get_wpx_adaptation_instance(), ap_data, @@ -1035,57 +962,14 @@ false_t, false_t ) == core_connect_ok ) { - DEBUG1("core_operation_get_available_iaps_c::remove_matching_iaps() - match found for IAP ID %u", - iap->id ); - - u32_t* iap_id = new u32_t; - if( iap_id ) - { - if ( server_m->get_core_settings().is_iap_id_in_weak_list( iap->id) ) - { - DEBUG( "core_operation_get_available_iaps_c::remove_matching_iaps() - IAP ID is in weak list" ); - - if ( ap_data.rcpi() > treshold_val ) - { - DEBUG( "core_operation_get_available_iaps_c::remove_matching_iaps() - RCPI improved enough, remove IAP ID from weak list" ); - *iap_id = iap->id; - iap_id_list_m.append( iap_id ); - iap_id = NULL; - - server_m->get_core_settings().remove_iap_id_from_weak_list( iap->id ); - } + DEBUG7("core_operation_get_available_iaps_c::remove_matching_iaps() - BSSID %02X:%02X:%02X:%02X:%02X:%02X matches IAP ID %u", + bssid.addr[0], bssid.addr[1], bssid.addr[2], + bssid.addr[3], bssid.addr[4], bssid.addr[5], + iap_data.id() ); - } - else - { - *iap_id = iap->id; - iap_id_list_m.append( iap_id ); - iap_id = NULL; - } - } - - /** Using a temporary pointer to guarantee list iterator working. */ - core_iap_data_s* temp = iap; - - iap = iap_data_list_m.next(); - core_error_e ret = iap_data_list_m.remove( temp ); - if( ret != core_error_ok ) - { - if( iap ) - { - DEBUG1("core_operation_get_available_iaps_c::remove_matching_iaps() - error while removing IAP entry (%d)", - iap->id ); - } - } - - delete temp; - temp = NULL; - delete iap_id; - iap_id = NULL; - } - else - { - iap = iap_data_list_m.next(); + update_iap_availability( + iap_data.id(), + ap_data.rcpi() ); } } } @@ -1231,6 +1115,96 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- +// +bool_t core_operation_get_available_iaps_c::is_ssid_in_list( + const core_ssid_s& ssid, + core_type_list_c& ssid_list ) const + { + core_type_list_iterator_c ssid_iter( ssid_list ); + for( core_ssid_s* entry = ssid_iter.first(); entry; entry = ssid_iter.next() ) + { + if( *entry == ssid ) + { + return true_t; + } + } + + return false_t; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +bool_t core_operation_get_available_iaps_c::is_iap_in_availability_list( + u32_t iap_id, + core_type_list_c& iap_list ) const + { + core_type_list_iterator_c iap_iter( iap_list ); + for( core_iap_availability_data_s* entry = iap_iter.first(); entry; entry = iap_iter.next() ) + { + if( entry->id == iap_id ) + { + return true_t; + } + } + + return false_t; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void core_operation_get_available_iaps_c::update_iap_availability( + u32_t iap_id, + u8_t iap_rcpi ) + { + core_type_list_iterator_c iap_iter( iap_availability_list_m ); + bool_t is_found( false_t ); + core_iap_availability_data_s* entry = iap_iter.first(); + while( entry && !is_found ) + { + if( entry->id == iap_id ) + { + is_found = true_t; + if( entry->rcpi < iap_rcpi ) + { + DEBUG3("core_operation_get_available_iaps_c::update_iap_availability() - IAP %u already available, RCPI improved from %u to %u", + iap_id, entry->rcpi, iap_rcpi ); + + entry->rcpi = iap_rcpi; + } + else + { + DEBUG3("core_operation_get_available_iaps_c::update_iap_availability() - IAP %u already available, RCPI not improved (%u vs %u)", + iap_id, iap_rcpi, entry->rcpi ); + } + } + + entry = iap_iter.next(); + } + + if( !is_found ) + { + core_iap_availability_data_s* data = new core_iap_availability_data_s; + if( data ) + { + DEBUG2("core_operation_get_available_iaps_c::update_iap_availability() - IAP %u marked as available, RCPI is %u", + iap_id, iap_rcpi ); + + data->id = iap_id; + data->rcpi = iap_rcpi; + core_error_e ret = iap_availability_list_m.append( data ); + if( ret != core_error_ok ) + { + delete data; + } + data = NULL; + } + } + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- // bool_t core_operation_get_available_iaps_c::receive_frame( const core_frame_dot11_c* frame, diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_operation_roam.cpp --- a/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_operation_roam.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_operation_roam.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 76.1.2 % +* %version: 76.1.5 % */ #include "core_operation_roam.h" @@ -433,6 +433,12 @@ bssid.addr[0], bssid.addr[1], bssid.addr[2], bssid.addr[3], bssid.addr[4], bssid.addr[5] ); + /** + * is_eapol_disconnecting is not updated here because this disassociation + * is for the previous AP and thus we don't really care when this + * request gets completed. + */ + server_m->get_eapol_instance().disassociation( &network ); } } @@ -796,21 +802,21 @@ core_management_status_e management_status ) { DEBUG( "core_operation_roam_c::connect_status()" ); - + core_iap_data_c& iap_data( server_m->get_connection_data()->iap_data() ); - if ( management_status == core_management_status_assoc_denied_full_ap ) - { - DEBUG( "core_operation_roam_c::connect_status() - AP full" ); - return core_connect_ap_full; - } - if ( request_status == core_error_eapol_auth_start_timeout ) { DEBUG( "core_operation_roam_c::connect_status() - EAPOL authentication timeout before authentication was started" ); return core_connect_eapol_auth_start_timeout; } + if ( request_status == core_error_unsupported_config ) + { + DEBUG( "core_operation_roam_c::connect_status() - AP has an unsupported configuration" ); + return core_connect_ap_unsupported_configuration; + } + switch( iap_data.security_mode() ) { case core_security_mode_wep: @@ -919,6 +925,20 @@ } } + if ( management_status == core_management_status_assoc_denied_full_ap ) + { + DEBUG( "core_operation_roam_c::connect_status() - AP full" ); + return core_connect_ap_full; + } + + if ( management_status == core_management_status_unsupported_capabilities || + management_status == core_management_status_assoc_unsup_basic_rates || + management_status == core_management_status_assoc_unsup_ht_features ) + { + DEBUG( "core_operation_roam_c::connect_status() - AP has an unsupported configuration" ); + return core_connect_ap_unsupported_configuration; + } + return core_connect_undefined; } @@ -945,6 +965,15 @@ } /** + * Unsupported configuration is always fatal. + */ + if( request_status == core_error_unsupported_config ) + { + DEBUG( "core_operation_roam_c::is_fatal_failure() - fatal, unsupported configuration" ); + return core_ap_blacklist_reason_association_status; + } + + /** * Don't consider a failed (re-)association attempt as fatal since it's * possible AP just doesn't have our authentication cached any more. */ diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_server.cpp --- a/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_server.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_server.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 90 % +* %version: 91 % */ #include "core_server.h" @@ -1104,7 +1104,7 @@ u32_t request_id, bool_t is_active_scan_allowed, core_type_list_c& iap_data_list, - core_type_list_c& iap_id_list, + core_type_list_c& iap_availability_list, core_type_list_c* iap_ssid_list, ScanList& scan_data ) { @@ -1117,7 +1117,7 @@ &callback_m, is_active_scan_allowed, iap_data_list, - iap_id_list, + iap_availability_list, iap_ssid_list, scan_data ); diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_settings.cpp --- a/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_settings.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_settings.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -15,6 +15,9 @@ * */ +/* +* %version: 26 % +*/ #include "core_settings.h" #include "core_settings_default.h" @@ -45,7 +48,6 @@ uapsd_settings_m( DEFAULT_UAPSD_SETTINGS ), power_save_settings_m( DEFAULT_POWER_SAVE_SETTINGS ), block_ack_usage_m( DEFAULT_BLOCK_ACK_USAGE ), - weak_iap_list_m( ), features_m( features ) { DEBUG1( "core_settings_c::core_settings_c() - features: 0x%08X", @@ -67,7 +69,6 @@ perm_whitelist_m.clear(); perm_blacklist_m.clear(); - weak_iap_list_m.clear(); } // --------------------------------------------------------------------------- @@ -690,61 +691,6 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -// -void core_settings_c::add_iap_id_to_weak_iap_list( u32_t iap_id ) - { - if ( !is_iap_id_in_weak_list( iap_id ) ) - { - u32_t* weak_iap_id = new u32_t; - if ( weak_iap_id ) - { - *weak_iap_id = iap_id; - weak_iap_list_m.append( weak_iap_id ); - } - } - } - -// --------------------------------------------------------------------------- -// --------------------------------------------------------------------------- -// -bool_t core_settings_c::is_iap_id_in_weak_list( u32_t iap_id ) - { - u32_t* iap_id_p = weak_iap_list_m.first(); - while ( iap_id_p ) - { - if ( *iap_id_p == iap_id ) - { - return true_t; - } - - iap_id_p = weak_iap_list_m.next(); - } - - return false_t; - } - -// --------------------------------------------------------------------------- -// --------------------------------------------------------------------------- -// -void core_settings_c::remove_iap_id_from_weak_list( u32_t iap_id ) - { - u32_t* iap_id_p = weak_iap_list_m.first(); - while ( iap_id_p ) - { - if ( *iap_id_p == iap_id ) - { - weak_iap_list_m.remove( iap_id_p ); - delete iap_id_p; - - return; - } - - iap_id_p = weak_iap_list_m.next(); - } - } - -// --------------------------------------------------------------------------- -// --------------------------------------------------------------------------- // void core_settings_c::set_enabled_features( u32_t features ) diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/bwinscw/wlmserveru.def --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/bwinscw/wlmserveru.def Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/bwinscw/wlmserveru.def Mon Jun 21 17:43:00 2010 +0300 @@ -31,7 +31,7 @@ ?CancelDirectedRoam@RWLMServer@@QAEXXZ @ 30 NONAME ; void RWLMServer::CancelDirectedRoam(void) ?GetAcTrafficStatus@RWLMServer@@QAEHAAV?$TFixedArray@W4TWlmAcTrafficStatus@@$03@@@Z @ 31 NONAME ; int RWLMServer::GetAcTrafficStatus(class TFixedArray &) ?GetScanResults@RWLMServer@@QAEHAAVScanList@@ABVTDesC8@@AAHAAI@Z @ 32 NONAME ; int RWLMServer::GetScanResults(class ScanList &, class TDesC8 const &, int &, unsigned int &) - ?GetAvailableIaps@RWLMServer@@QAEXAAVTDes8@@00AAVTRequestStatus@@@Z @ 33 NONAME ; void RWLMServer::GetAvailableIaps(class TDes8 &, class TDes8 &, class TDes8 &, class TRequestStatus &) + ?GetAvailableIaps@RWLMServer@@QAEXAAVTDes8@@00HAAVTRequestStatus@@@Z @ 33 NONAME ; void RWLMServer::GetAvailableIaps(class TDes8 &, class TDes8 &, class TDes8 &, int, class TRequestStatus &) ?GetConnectionState@RWLMServer@@QAE?AW4TWlanConnectionState@@XZ @ 34 NONAME ; enum TWlanConnectionState RWLMServer::GetConnectionState(void) ?CancelDeleteTrafficStream@RWLMServer@@QAEXXZ @ 35 NONAME ; void RWLMServer::CancelDeleteTrafficStream(void) ?DeleteTrafficStream@RWLMServer@@QAEXAAVTRequestStatus@@I@Z @ 36 NONAME ; void RWLMServer::DeleteTrafficStream(class TRequestStatus &, unsigned int) @@ -39,7 +39,7 @@ ?NotifyChangedSettings@RWLMServer@@QAEXXZ @ 38 NONAME ; void RWLMServer::NotifyChangedSettings(void) ?GetSystemMode@RWLMServer@@QAEHAAW4TWlanSystemMode@@@Z @ 39 NONAME ; int RWLMServer::GetSystemMode(enum TWlanSystemMode &) ?Join@RWLMServer@@QAEXAAVTRequestStatus@@KPAUTWLMOverrideSettings@@@Z @ 40 NONAME ; void RWLMServer::Join(class TRequestStatus &, unsigned long, struct TWLMOverrideSettings *) - ?GetAvailableIaps@RWLMServer@@QAEHAAUTWlmAvailableIaps@@AAHAAI@Z @ 41 NONAME ; int RWLMServer::GetAvailableIaps(struct TWlmAvailableIaps &, int &, unsigned int &) + ?GetAvailableIaps@RWLMServer@@QAEHAAUTWlmAvailableIaps@@AAHAAIH@Z @ 41 NONAME ; int RWLMServer::GetAvailableIaps(struct TWlmAvailableIaps &, int &, unsigned int &, int) ?CancelNotifies@RWLMServer@@QAEXXZ @ 42 NONAME ; void RWLMServer::CancelNotifies(void) ?UpdateRcpNotificationBoundary@RWLMServer@@QAEHJJ@Z @ 43 NONAME ; int RWLMServer::UpdateRcpNotificationBoundary(long, long) ?CancelJoin@RWLMServer@@QAEXXZ @ 44 NONAME ; void RWLMServer::CancelJoin(void) diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/conf/wlanengine.confml Binary file wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/conf/wlanengine.confml has changed diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/eabi/wlmserveru.def --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/eabi/wlmserveru.def Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/eabi/wlmserveru.def Mon Jun 21 17:43:00 2010 +0300 @@ -10,8 +10,8 @@ _ZN10RWLMServer14GetScanResultsER8ScanListRK6TDesC8RiRj @ 9 NONAME _ZN10RWLMServer14GetScanResultsER8ScanListRK6TDesC8RiRjR14TRequestStatus @ 10 NONAME _ZN10RWLMServer15GetSecurityModeER13TWlanSecurity @ 11 NONAME - _ZN10RWLMServer16GetAvailableIapsER17TWlmAvailableIapsRiRj @ 12 NONAME - _ZN10RWLMServer16GetAvailableIapsER5TDes8S1_S1_R14TRequestStatus @ 13 NONAME + _ZN10RWLMServer16GetAvailableIapsER17TWlmAvailableIapsRiRji @ 12 NONAME + _ZN10RWLMServer16GetAvailableIapsER5TDes8S1_S1_iR14TRequestStatus @ 13 NONAME _ZN10RWLMServer16GetPowerSaveModeER14TWlanPowerSave @ 14 NONAME _ZN10RWLMServer16GetUapsdSettingsER18TWlanUapsdSettings @ 15 NONAME _ZN10RWLMServer16SetPowerSaveModeE18TWlanPowerSaveMode @ 16 NONAME diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/rwlmserver.h --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/rwlmserver.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/rwlmserver.h Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 25 % +* %version: 25.1.1 % */ #ifndef RWLMSERVER_H @@ -232,18 +232,21 @@ * @param aAvailableIaps Array of IAP IDs available. * @param aCacheLifetime how old cached results (in seconds) the client is willing to accept. * @param aMaxDelay maximum time (in seconds) the client is willing to wait for the scan results. + * @param aFilteredResults Whether availability is filtered based on signal strength. * @return General Symbian error code. */ IMPORT_C TInt GetAvailableIaps( TWlmAvailableIaps& aAvailableIaps, TInt& aCacheLifetime, - TUint& aMaxDelay ); + TUint& aMaxDelay, + TBool aFilteredResults ); /** * Get available WLAN IAPs. * @param aAvailableIaps Array of IAP IDs available. * @param aCacheLifetime how old cached results (in seconds) the client is willing to accept. * @param aMaxDelay maximum time (in seconds) the client is willing to wait for the scan results. + * @param aFilteredResults Whether availability is filtered based on signal strength. * @param aStatus Status of the calling active object. * * In order to call this method, an instance of TWlmAvailableIaps must @@ -258,6 +261,7 @@ TDes8& aAvailableIaps, TDes8& aCacheLifetime, TDes8& aMaxDelay, + TBool aFilteredResults, TRequestStatus& aStatus ); /** diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlanmgmtimpl.h --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlanmgmtimpl.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlanmgmtimpl.h Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 21 % +* %version: 21.1.1 % */ #ifndef WLANMGMTIMPL_H @@ -375,6 +375,7 @@ TWlanConnectionExtentedSecurityMode& aMode ); /** + * (From MWlanMgmtInterface) * Activate the extended notification service. * * After the client has enabled the notification service, it can @@ -389,6 +390,7 @@ TUint aCallbackInterfaceVersion ); /** + * (From MWlanMgmtInterface) * Create a virtual traffic stream. * * @param aStatus Status of the calling active object. On successful @@ -407,11 +409,13 @@ TWlanTrafficStreamStatus& aStreamStatus ); /** + * (From MWlanMgmtInterface) * Cancel an outstanding traffic stream creation request. */ virtual void CancelCreateTrafficStream(); /** + * (From MWlanMgmtInterface) * Delete a virtual traffic stream. * * @param aStatus Status of the calling active object. On successful @@ -424,11 +428,13 @@ TUint aStreamId ); /** + * (From MWlanMgmtInterface) * Cancel an outstanding traffic stream deletion request. */ virtual void CancelDeleteTrafficStream(); /** + * (From MWlanMgmtInterface) * Initiate a roam to the given BSSID. * * @param aStatus Status of the calling active object. On successful @@ -442,6 +448,7 @@ const TWlanBssid& aBssid ); /** + * (From MWlanMgmtInterface) * Cancel an outstanding directed roam request. */ virtual void CancelDirectedRoam(); @@ -454,6 +461,7 @@ TInt aStatus ); /** + * (From MWlanMgmtInterface) * Start aggressive background scanning. * @param aInterval Scan interval for aggressive mode (in seconds). * Valid range: 1-120 seconds. @@ -461,6 +469,37 @@ virtual TInt StartAggressiveBgScan( TUint aInterval ); + /** + * (From MWlanMgmtInterface) + * Get the available WLAN IAPs. + * + * @param aCacheLifetime Defines how many seconds old cached results the client + * is willing to accept. The valid is range is from 0 to + * 60 seconds. The value of -1 means the system default will + * be used. The aCacheLifetime parameter has a meaning only + * when the aMaxDelay parameter is zero. + * Value will be changed to the actual value used by the + * system. + * @param aMaxDelay Maximum amount of seconds the client is willing to wait for + * the availability results. The valid range is from 0 to 1200 + * seconds or KWlanInfiniteScanDelay. KWlanInfiniteScanDelay + * will never cause a scan, but the request will be + * completed when any other broadcast scan request is completed. + * Value will be changed to the actual value used by the system. + * @param aFilteredResults Whether availability is filtered based on signal strength. + ETrue if filtering is allowed, EFalse if not. + * @param aStatus Status of the calling active object. On successful + * completion contains KErrNone, otherwise one of the + * system-wide error codes. + * @param aAvailableIaps Array of IAPs available. + */ + virtual void GetAvailableIaps( + TInt& aCacheLifetime, + TUint& aMaxDelay, + TBool aFilteredResults, + TRequestStatus& aStatus, + RArray& aAvailableIaps ); + protected: // Methods /** @@ -686,6 +725,23 @@ TUint& aMaxDelay ); /** + * C++ default constructor. + * @param aCallback Callback interface to CWlanMgmtImpl. + * @param aServer Interface to RWLMServer. + * @param aAvailableIaps Available IAPs are stored here. + * @param aCacheLifetime how old cached results (in seconds) the client is willing to accept. + * @param aMaxDelay maximum time the client is willing to wait for the scan results. + * @param aFilteredResults Whether availability is filtered based on signal strength. + */ + CWlanAvailableIapsRequest( + CWlanMgmtImpl& aCallback, + RWLMServer& aServer, + RArray& aAvailableIaps, + TInt& aCacheLifetime, + TUint& aMaxDelay, + TBool aFilteredResults ); + + /** * Destructor. */ virtual ~CWlanAvailableIapsRequest(); @@ -728,12 +784,17 @@ // Interface to RWLMServer RWLMServer& iServer; - // Handle to client storage for available IAPs - RArray& iPendingAvailableIaps; - + // Handle to client storage for available IAP IDs for legacy methods. + // Not owned by this pointer. + RArray* iPendingAvailableIapIds; + + // Handle to client storage for available IAPs. + // Not owned by this pointer. + RArray* iPendingAvailableIaps; + // Storage for available IAPs TWlmAvailableIaps iAvailableIaps; - + // The package buffer needed for the asynchronous request TPckg iAvailableIapsBuf; @@ -743,6 +804,8 @@ // The package buffer needed for the asynchronous request TPckg iMaxDelayBuf; + // Whether availability is filtered based on signal strength. + TBool iFilteredResults; }; diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlanscanresultcache.h --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlanscanresultcache.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlanscanresultcache.h Mon Jun 21 17:43:00 2010 +0300 @@ -15,6 +15,9 @@ * */ +/* +* %version: 13 % +*/ #ifndef WLANSCANRESULTCACHE_H #define WLANSCANRESULTCACHE_H @@ -33,6 +36,7 @@ TBuf8 ssid; EConnectionMode networkType; WlanSecurityMode securityMode; + TUint8 rcpi; }; /** @@ -75,7 +79,7 @@ /** * Updates the list of available networks (IAPs and SSIDs) - * @param aIapIdList List of available IAPs. + * @param aIapAvailabilityList List of available IAPs. * @param aNetworkList List of available networks. * @param aNewIapsAvailable is set to ETrue on completion if * new networks or IAPs were detected since the last update. @@ -83,7 +87,7 @@ * networks or IAPs have been lost since the last update. */ void UpdateAvailableNetworksList( - core_type_list_c& aIapIdList, + core_type_list_c& aIapAvailabilityList, RArray& aNetworkList, TBool& aNewIapsAvailable, TBool& aOldIapsLost ); @@ -96,7 +100,7 @@ * @return Pointer to list of available IAPs or NULL if they are not available * or they are too old. */ - RArray* AvailableIaps( + RArray* AvailableIaps( RArray& aIapList, TUint aCacheLifetime ); @@ -144,13 +148,23 @@ const TWlanAvailableNetwork& aSecond ); /** + * Method for determining whether two IAPs are equal. + * @param aFirst First IAP. + * @param aSecond Second IAP. + * @return Result of comparison. + */ + static TBool IsIapEqual( + const TWlmAvailabilityData& aFirst, + const TWlmAvailabilityData& aSecond ); + + /** * Check whether the given IAP list is equal with the given IAP data list. * * @param aIapList IAP list to compare. * @param aIapDataList IAP data list to compare against. * @return ETrue is the lists are equal, EFalse otherwise. */ - TBool IsIapListEqual( + static TBool IsIapListEqual( const RArray& aFirst, const RArray& aSecond ); @@ -177,7 +191,7 @@ RArray iIapList; /** Latest list of available IAPs */ - RArray iAvailableIapList; + RArray iAvailableIapList; /** Latest list of available networks */ RArray iAvailableNetworkList; diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlmclientserver.h --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlmclientserver.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlmclientserver.h Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 42 % +* %version: 43 % */ #ifndef WLMCLIENTSERVER_H @@ -398,15 +398,24 @@ }; /** + * Data structure for storing IAP availability data. + */ +struct TWlmAvailabilityData + { + TUint iapId; + TUint rcpi; + }; + +/** * Data structure for storing available IAP IDs. */ struct TWlmAvailableIaps { /** The number of IAPs available. */ TUint32 count; - + /** The available IAP IDs. */ - TFixedArray iaps; + TFixedArray iaps; }; /** diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlmserver.h --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlmserver.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/inc/wlmserver.h Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 55.1.1 % +* %version: 55.1.2 % */ #ifndef WLMSERVER_H @@ -94,6 +94,7 @@ TAny* iParam1; TAny* iParam2; TAny* iParam3; + TAny* iParam4; TUint* iTime; SRequestMapEntry() : @@ -104,6 +105,7 @@ iParam1( NULL ), iParam2( NULL ), iParam3( NULL ), + iParam4( NULL ), iTime( NULL ) { } }; @@ -983,11 +985,11 @@ TUint& aTriggeringRequestIndex ); /** - * Notify the server that a background scan has been done. - */ + * Notify the server that a background scan has been done. + */ void NotifyBackgroundScanDone( ScanList* aScanList, - core_type_list_c* aIapIdList ); + core_type_list_c& aIapAvailabilityData ); /** * Check if this request can be completed. @@ -1377,7 +1379,22 @@ * Flag indicating whether aggressive scanning has to be performed * after link loss. */ - TBool iAggressiveScanningAfterLinkLoss; + TBool iAggressiveScanningAfterLinkLoss; + + /** + * WLAN device settings. + */ + CWlanDeviceSettings::SWlanDeviceSettings iDeviceSettings; + + /** + * List of "weak" IAP IDs. + */ + RArray iIapWeakList; + + /** + * IAP ID of the connection. + */ + TUint iConnectionIapId; }; diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/rwlmserver.cpp --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/rwlmserver.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/rwlmserver.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 28 % +* %version: 28.1.1 % */ #include @@ -366,16 +366,17 @@ EXPORT_C TInt RWLMServer::GetAvailableIaps( TWlmAvailableIaps& aAvailableIaps, TInt& aCacheLifetime, - TUint& aMaxDelay ) + TUint& aMaxDelay, + TBool aFilteredResults ) { - DEBUG2( "RWLMServer::GetAvailableIaps( aAvailableIaps, aCacheLifetime(%d), aMaxDelay(%u) )", - aCacheLifetime, aMaxDelay ); + DEBUG3( "RWLMServer::GetAvailableIaps( aAvailableIaps, aCacheLifetime(%d), aMaxDelay(%u), aFilteredResult(%u) )", + aCacheLifetime, aMaxDelay, aFilteredResults ); TRequestStatus status; TPckg inPckg( aAvailableIaps ); TPckg inPckg2( aCacheLifetime ); TPckg inPckg3( aMaxDelay ); - GetAvailableIaps( inPckg, inPckg2, inPckg3, status ); + GetAvailableIaps( inPckg, inPckg2, inPckg3, aFilteredResults, status ); User::WaitForRequest( status ); DEBUG1( "RWLMServer::GetAvailableIaps() - Server returned status %d", status.Int() ); @@ -389,12 +390,14 @@ TDes8& aAvailableIaps, TDes8& aCacheLifetime, TDes8& aMaxDelay, + TBool aFilteredResults, TRequestStatus& aStatus ) { - DEBUG( "RWLMServer::GetAvailableIaps( aAvailableIaps, aCacheLifetime, aMaxDelay, aStatus )" ); - + DEBUG1( "RWLMServer::GetAvailableIaps( aAvailableIaps, aCacheLifetime, aMaxDelay, aFilteredResult(%u), aStatus )", + aFilteredResults ); + aStatus = KRequestPending; - TIpcArgs params( &aAvailableIaps, &aCacheLifetime, &aMaxDelay ); + TIpcArgs params( &aAvailableIaps, &aCacheLifetime, &aMaxDelay, aFilteredResults ); SendReceive( EGetAvailableIaps, params, aStatus ); } diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanconversionutil.cpp --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanconversionutil.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanconversionutil.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -16,12 +16,12 @@ */ /* -* %version: 86 % +* %version: 86.1.1 % */ #include #include - +#include #include "wlanconversionutil.h" #include "wlmserver.h" #include "wlmtsparams.h" @@ -428,6 +428,8 @@ return KErrWlanInternalError; case core_connect_wapi_certificate_failure: return KErrWlanInternalError; + case core_connect_ap_unsupported_configuration: + return KErrIfAuthenticationFailure; default: return KErrUnknown; } @@ -1000,6 +1002,7 @@ case core_error_challenge_failure: case core_error_not_connected: case core_error_general: + case core_error_unsupported_config: default: return KErrGeneral; } @@ -1031,6 +1034,8 @@ return core_error_cancel; case KErrAlreadyExists: return core_error_already_exists; + case KWlanErrUnsupportedNwConf: + return core_error_unsupported_config; default: return core_error_general; } diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanmgmtimpl.cpp --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanmgmtimpl.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanmgmtimpl.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 31 % +* %version: 31.1.2 % */ // INCLUDE FILES @@ -401,14 +401,14 @@ iCacheLifetime = KWlanMgmtDefaultCacheLifetime; iMaxDelay = KWlanMgmtDefaultMaxDelay; - TInt ret = iServer.GetAvailableIaps( iaps, iCacheLifetime, iMaxDelay ); + TInt ret = iServer.GetAvailableIaps( iaps, iCacheLifetime, iMaxDelay, ETrue ); if ( ret != KErrNone ) { return ret; } for ( TUint idx( 0 ); idx < iaps.count; ++idx ) { - aAvailableIaps.Append( iaps.iaps[idx] ); + aAvailableIaps.Append( iaps.iaps[idx].iapId ); } return KErrNone; @@ -683,7 +683,7 @@ // void CWlanMgmtImpl::ActivateExtendedNotificationsL( MWlanMgmtNotifications& aCallback, - TUint aCallbackInterfaceVersion = KWlanCallbackInterfaceVersion ) + TUint aCallbackInterfaceVersion ) { TraceDump( INFO_LEVEL, ( _L( "CWlanMgmtImpl::ActivateExtendedNotificationsL()" ) ) ); iClientNotification = &aCallback; @@ -798,6 +798,33 @@ } // --------------------------------------------------------- +// CWlanMgmtImpl::GetAvailableIaps +// --------------------------------------------------------- +// +void CWlanMgmtImpl::GetAvailableIaps( + TInt& aCacheLifetime, + TUint& aMaxDelay, + TBool aFilteredResults, + TRequestStatus& aStatus, + RArray& aAvailableIaps ) + { + TraceDump( INFO_LEVEL, ( _L( "CWlanMgmtImpl::GetAvailableIaps() (async)" ) ) ); + + aAvailableIaps.Reset(); + + aStatus = KRequestPending; + iPendingAvailableIapsStatus = &aStatus; + iAvailableIapsRequest = new CWlanAvailableIapsRequest( *this, iServer, aAvailableIaps, aCacheLifetime, aMaxDelay, aFilteredResults ); + if ( !iAvailableIapsRequest ) + { + User::RequestComplete( iPendingAvailableIapsStatus, KErrNoMemory ); + iPendingAvailableIapsStatus = NULL; + return; + } + iAvailableIapsRequest->IssueRequest(); + } + +// --------------------------------------------------------- // CWlanMgmtImpl::ScanComplete // --------------------------------------------------------- // @@ -1068,10 +1095,36 @@ CActive( CActive::EPriorityStandard ), iCallback( aCallback ), iServer( aServer ), - iPendingAvailableIaps( aAvailableIaps ), + iPendingAvailableIapIds( &aAvailableIaps ), + iPendingAvailableIaps( NULL ), iAvailableIapsBuf( iAvailableIaps ), iCacheLifetimeBuf( aCacheLifetime ), - iMaxDelayBuf( aMaxDelay ) + iMaxDelayBuf( aMaxDelay ), + iFilteredResults( ETrue ) + { + TraceDump( INFO_LEVEL, ( _L( "CWlanAvailableIapsRequest::CWlanAvailableIapsRequest()" ) ) ); + CActiveScheduler::Add( this ); + } + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CWlanAvailableIapsRequest::CWlanAvailableIapsRequest( + CWlanMgmtImpl& aCallback, + RWLMServer& aServer, + RArray& aAvailableIaps, + TInt& aCacheLifetime, + TUint& aMaxDelay, + TBool aFilteredResults ) : + CActive( CActive::EPriorityStandard ), + iCallback( aCallback ), + iServer( aServer ), + iPendingAvailableIapIds( NULL ), + iPendingAvailableIaps( &aAvailableIaps ), + iAvailableIapsBuf( iAvailableIaps ), + iCacheLifetimeBuf( aCacheLifetime ), + iMaxDelayBuf( aMaxDelay ), + iFilteredResults( aFilteredResults ) { TraceDump( INFO_LEVEL, ( _L( "CWlanAvailableIapsRequest::CWlanAvailableIapsRequest()" ) ) ); CActiveScheduler::Add( this ); @@ -1082,6 +1135,8 @@ { TraceDump( INFO_LEVEL, ( _L( "CWlanAvailableIapsRequest::CWlanAvailableIapsRequest()" ) ) ); Cancel(); + iPendingAvailableIapIds = NULL; + iPendingAvailableIaps = NULL; } // --------------------------------------------------------- @@ -1091,7 +1146,7 @@ void CWlanAvailableIapsRequest::IssueRequest() { TraceDump( INFO_LEVEL, ( _L( "CWlanAvailableIapsRequest::IssueRequest()" ) ) ); - iServer.GetAvailableIaps( iAvailableIapsBuf, iCacheLifetimeBuf, iMaxDelayBuf, iStatus ); + iServer.GetAvailableIaps( iAvailableIapsBuf, iCacheLifetimeBuf, iMaxDelayBuf, iFilteredResults, iStatus ); SetActive(); } @@ -1102,9 +1157,24 @@ void CWlanAvailableIapsRequest::RunL() { TraceDump( INFO_LEVEL, ( _L( "CWlanAvailableIapsRequest::RunL()" ) ) ); - for ( TUint idx( 0 ); idx < iAvailableIaps.count; ++idx ) + if( iPendingAvailableIapIds ) + { + for ( TUint idx( 0 ); idx < iAvailableIaps.count; ++idx ) + { + iPendingAvailableIapIds->Append( iAvailableIaps.iaps[idx].iapId ); + } + } + else if( iPendingAvailableIaps ) { - iPendingAvailableIaps.Append( iAvailableIaps.iaps[idx] ); + for ( TUint idx( 0 ); idx < iAvailableIaps.count; ++idx ) + { + TWlanIapAvailabilityData tmp; + tmp.iIapId = iAvailableIaps.iaps[idx].iapId; + // RCPI -> RSSI CONVERSION + // Note: conversion may round the result by 0.5 units + tmp.iRssi = ( 110 - ( iAvailableIaps.iaps[idx].rcpi / 2 ) ); + iPendingAvailableIaps->Append( tmp ); + } } iCallback.AvailableIapsComplete( iStatus.Int() ); } diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanscanresultcache.cpp --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanscanresultcache.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanscanresultcache.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -15,6 +15,9 @@ * */ +/* +* %version: 13 % +*/ #include "wlanscanresultcache.h" #include "am_debug.h" @@ -119,7 +122,7 @@ // ----------------------------------------------------------------------------- // void CWlanScanResultCache::UpdateAvailableNetworksList( - core_type_list_c& aIapIdList, + core_type_list_c& aIapAvailabilityList, RArray& aNetworkList, TBool& aNewIapsAvailable, TBool& aOldIapsLost ) @@ -127,7 +130,7 @@ DEBUG( "CWlanScanResultCache::UpdateAvailableNetworksList()" ); DEBUG1( "CWlanScanResultCache::UpdateAvailableNetworksList() - %u IAP(s) available", - aIapIdList.count() ); + aIapAvailabilityList.count() ); DEBUG1( "CWlanScanResultCache::UpdateAvailableNetworksList() - %u IAP(s) previously available", iAvailableIapList.Count() ); DEBUG1( "CWlanScanResultCache::UpdateAvailableNetworksList() - %u networks(s) available", @@ -140,26 +143,27 @@ const TInt oldNetworkCount( iAvailableNetworkList.Count() ); aNewIapsAvailable = EFalse; aOldIapsLost = EFalse; - TIdentityRelation isEqual( CWlanScanResultCache::IsNetworkEqual ); + TIdentityRelation isNetworkEqual( CWlanScanResultCache::IsNetworkEqual ); + TIdentityRelation isIapEqual( CWlanScanResultCache::IsIapEqual ); // Iterate through previously available IAPs to find lost IAPs. TInt idx( 0 ); //while( idx < oldIapCount && !aOldIapsLost ) while( idx < oldIapCount ) { - const TUint32* newId = aIapIdList.first(); + const core_iap_availability_data_s* newIap = aIapAvailabilityList.first(); - while( newId ) + while( newIap ) { - if( *newId == iAvailableIapList[idx] ) + if( newIap->id == iAvailableIapList[idx].iapId ) { break; } - newId = aIapIdList.next(); + newIap = aIapAvailabilityList.next(); } - if( !newId ) + if( !newIap ) { DEBUG1( "CWlanScanResultCache::UpdateAvailableNetworksList() - old IAP %u has been lost", iAvailableIapList[idx] ); @@ -170,18 +174,21 @@ } // Iterate through available IAPs to find new IAPs. - const TUint32* newId = aIapIdList.first(); + const core_iap_availability_data_s* newIap = aIapAvailabilityList.first(); //while( newId && !aNewIapsAvailable ) - while( newId ) + while( newIap ) { - if ( iAvailableIapList.Find( *newId ) == KErrNotFound ) + TWlmAvailabilityData tmp; + tmp.iapId = newIap->id; + tmp.rcpi = newIap->rcpi; + if ( iAvailableIapList.Find( tmp, isIapEqual ) == KErrNotFound ) { DEBUG1( "CWlanScanResultCache::UpdateAvailableNetworksList() - new IAP %u has been detected", - *newId ); + newIap->id ); aNewIapsAvailable = ETrue; } - - newId = aIapIdList.next(); + + newIap = aIapAvailabilityList.next(); } // Iterate through previously available networks to find lost networks. @@ -189,7 +196,7 @@ //while ( idx < oldNetworkCount && !aOldIapsLost ) while ( idx < oldNetworkCount ) { - if ( aNetworkList.Find( iAvailableNetworkList[idx], isEqual ) == KErrNotFound ) + if ( aNetworkList.Find( iAvailableNetworkList[idx], isNetworkEqual ) == KErrNotFound ) { DEBUG1S( "CWlanScanResultCache::UpdateAvailableNetworksList() - old network has been lost, SSID ", iAvailableNetworkList[idx].ssid.Length(), iAvailableNetworkList[idx].ssid.Ptr() ); @@ -203,7 +210,7 @@ //while( idx < newNetworkCount && !aNewIapsAvailable ) while( idx < newNetworkCount ) { - if ( iAvailableNetworkList.Find( aNetworkList[idx], isEqual ) == KErrNotFound ) + if ( iAvailableNetworkList.Find( aNetworkList[idx], isNetworkEqual ) == KErrNotFound ) { DEBUG1S( "CWlanScanResultCache::UpdateAvailableNetworksList() - new network has been detected, SSID ", aNetworkList[idx].ssid.Length(), aNetworkList[idx].ssid.Ptr() ); @@ -217,11 +224,14 @@ iAvailableNetworkList.Reset(); iIapListTimeStamp.HomeTime(); - newId = aIapIdList.first(); - while( newId ) + newIap = aIapAvailabilityList.first(); + while( newIap ) { - iAvailableIapList.Append( *newId ); - newId = aIapIdList.next(); + TWlmAvailabilityData tmp; + tmp.iapId = newIap->id; + tmp.rcpi = newIap->rcpi; + iAvailableIapList.Append( tmp ); + newIap = aIapAvailabilityList.next(); } idx = 0; @@ -236,7 +246,7 @@ // CWlanScanResultCache::AvailableIaps // ----------------------------------------------------------------------------- // -RArray* CWlanScanResultCache::AvailableIaps( +RArray* CWlanScanResultCache::AvailableIaps( RArray& aIapList, TUint aCacheLifetime ) { @@ -392,6 +402,22 @@ } // ----------------------------------------------------------------------------- +// CWlanScanResultCache::IsIapEqual +// ----------------------------------------------------------------------------- +// +TBool CWlanScanResultCache::IsIapEqual( + const TWlmAvailabilityData& aFirst, + const TWlmAvailabilityData& aSecond ) + { + if ( aFirst.iapId != aSecond.iapId ) + { + return EFalse; + } + + return ETrue; + } + +// ----------------------------------------------------------------------------- // CWlanScanResultCache::IsIapListEqual // ----------------------------------------------------------------------------- // diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanticktimer.cpp --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanticktimer.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanticktimer.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -17,7 +17,7 @@ */ /* -* %version: 1 % +* %version: 2 % */ #include "wlanticktimer.h" @@ -72,6 +72,7 @@ // CWlanTickTimer::~CWlanTickTimer() { + Cancel(); iTimer.Close(); } diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmscanrequest.cpp --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmscanrequest.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmscanrequest.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -29,7 +29,7 @@ { DEBUG( "CWlmScanRequest::NewL()" ); - CWlmScanRequest* self = new CWlmScanRequest( + CWlmScanRequest* self = new (ELeave) CWlmScanRequest( aClient ); CleanupStack::PushL( self ); self->ConstructL(); diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmserver.cpp --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmserver.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmserver.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 105.1.1 % +* %version: 105.1.3 % */ #include @@ -207,11 +207,10 @@ TWlanConversionUtil::ConvertMacAddress( core_mac, mac ); // Get Device Settings - CWlanDeviceSettings::SWlanDeviceSettings deviceSettings; - GetWlanSettingsL( deviceSettings ); - SetCachedRegion(deviceSettings.region, deviceSettings.regionTimestamp); + GetWlanSettingsL( iDeviceSettings ); + SetCachedRegion(iDeviceSettings.region, iDeviceSettings.regionTimestamp); core_device_settings_s coreSettings; // core needs the settings here - TWlanConversionUtil::ConvertDeviceSettings( coreSettings, deviceSettings ); + TWlanConversionUtil::ConvertDeviceSettings( coreSettings, iDeviceSettings ); // Create core server User::LeaveIfNull( iCoreServer = core_server_factory_c::instance( @@ -221,7 +220,7 @@ core_mac, TWlanConversionUtil::ConvertFeatureFlags( iSupportedFeatures, - deviceSettings.enabledFeatures ) ) ); + iDeviceSettings.enabledFeatures ) ) ); iCoreServer->disable_wlan( KWlanIntCmdDisableWlan ); // Create scan timer @@ -236,7 +235,7 @@ // Create scan cache iCache = CWlanScanResultCache::NewL(); - iConfiguredCacheLifetime = deviceSettings.scanExpirationTimer; + iConfiguredCacheLifetime = iDeviceSettings.scanExpirationTimer; // Create a callback for asynchronous core requests TCallBack callback( HandleCoreAsynchCb, this ); @@ -295,6 +294,7 @@ // Stop all plugins iGenericWlanPlugin.StopPlugins(); + iIapWeakList.Close(); delete iCoreServer; delete iDriverIf; iNotificationArray.Close(); @@ -647,7 +647,8 @@ TInt ret = GetCurrentIapId( static_cast(lanServiceId), *coreIapData ); - + iConnectionIapId = coreIapData->iap_id; + if ( ret != KErrNone ) { secondarySsidList.Close(); @@ -1210,6 +1211,10 @@ // Read cacheLifetime and maxDelay arguments TPckgBuf cacheLifetimePckg( KWlmDefaultScanCacheLifetime ); TPckgBuf maxDelayPckg( 0 ); + TBool isFiltered( + aMessage.Int3() ); + DEBUG1( "CWlmServer::GetAvailableIaps() - isFiltered: %u", + isFiltered ); if( aMessage.Read( 1, cacheLifetimePckg ) != KErrNone ) { DEBUG( "CWlmServer::GetAvailableIaps() - unable to read lifetime parameter" ); @@ -1241,28 +1246,47 @@ * See if cached IAP availability information is available. */ RArray iapList; - RArray* list = iCache->AvailableIaps( - iapList, - ( cacheLifetimePckg() == 0 ? 1 : cacheLifetimePckg() ) ); - + RArray* list = iCache->AvailableIaps( + iapList, + ( cacheLifetimePckg() == 0 ? 1 : cacheLifetimePckg() ) ); // Only complete with valid cache if maxDelay is zero if( list && maxDelayPckg() == 0 ) { - - TWlmAvailableIaps tmp; - const TInt listCount( - Min( list->Count(), KWlmMaxAvailableIaps ) ); - - DEBUG1( "CWlmServer::GetAvailableIaps() - using cached IAP list, list contains %d IAP(s)", listCount ); - - TInt listIdx( 0 ); - - while( listIdx < listCount ) + TWlmAvailableIaps tmp = { 0 }; + if( isFiltered ) + { + DEBUG1( "CWlmServer::GetAvailableIaps() - using filtered cached IAP list, list contains %d IAP(s)", + list->Count() ); + + for( TInt idx( 0 ); idx < list->Count() && tmp.count < KWlmMaxAvailableIaps; ++idx ) + { + if( (*list)[idx].rcpi >= iDeviceSettings.minRcpiForIapAvailability && + iIapWeakList.Find( (*list)[idx].iapId ) == KErrNotFound ) + { + DEBUG2( "CWlmServer::GetAvailableIaps() - IAP %u is available, RCPI is %u", + (*list)[idx].iapId, (*list)[idx].rcpi ); + tmp.iaps[tmp.count++] = (*list)[idx]; + } + else + { + DEBUG2( "CWlmServer::GetAvailableIaps() - IAP %u filtered, RCPI is %u", + (*list)[idx].iapId, (*list)[idx].rcpi ); + } + } + } + else { - tmp.iaps[ listIdx ] = (*list)[listIdx]; - ++listIdx; + DEBUG1( "CWlmServer::GetAvailableIaps() - using cached IAP list, list contains %d IAP(s)", + list->Count() ); + + for( TInt idx( 0 ); idx < list->Count() && tmp.count < KWlmMaxAvailableIaps; ++idx ) + { + DEBUG2( "CWlmServer::GetAvailableIaps() - IAP %u is available, RCPI is %u", + (*list)[idx].iapId, (*list)[idx].rcpi ); + tmp.iaps[tmp.count++] = (*list)[idx]; + } } - tmp.count = listCount; + TPckg outPckg( tmp ); aMessage.Write( 0, outPckg ); aMessage.Complete( KErrNone ); @@ -1317,8 +1341,9 @@ iapList.Close(); // Create output list - core_type_list_c* iapIdList = new core_type_list_c; - if( iapIdList == NULL ) + core_type_list_c* iapAvailabilityList = + new core_type_list_c; + if( iapAvailabilityList == NULL ) { aMessage.Complete( KErrNoMemory ); delete iapDataList; @@ -1333,7 +1358,7 @@ aMessage.Complete( KErrNoMemory ); delete iapDataList; delete iapSsidList; - delete iapIdList; + delete iapAvailabilityList; return; } @@ -1349,7 +1374,7 @@ aMessage.Complete( KErrNoMemory ); delete iapDataList; delete iapSsidList; - delete iapIdList; + delete iapAvailabilityList; delete scanList; return; @@ -1369,9 +1394,10 @@ mapEntry.iRequestId = iRequestIdCounter++; mapEntry.iSessionId = aSessionId; mapEntry.iParam0 = iapDataList; - mapEntry.iParam1 = iapIdList; + mapEntry.iParam1 = iapAvailabilityList; mapEntry.iParam2 = scanList; mapEntry.iParam3 = iapSsidList; + mapEntry.iParam4 = reinterpret_cast( isFiltered ); mapEntry.iTime = scanTime; iRequestMap.Append( mapEntry ); @@ -1497,7 +1523,8 @@ return err; } - + iDeviceSettings = settings; + // Only if startup is complete, inform current settings to BgScan if( iIsStartupComplete ) { @@ -1632,12 +1659,11 @@ // void CWlmServer::NotifyBackgroundScanDone( ScanList* aScanList, - core_type_list_c* aIapIdList ) + core_type_list_c& aIapAvailabilityData ) { DEBUG( "CWlmServer::NotifyBackgroundScanDone()" ); ASSERT( aScanList != NULL ); - ASSERT( aIapIdList != NULL ); - + // Unload the drivers immediately to conserve power. if( !iPlatform->IsWlanDisabled() && iConnectionState == EWlanStateNotConnected ) @@ -1653,7 +1679,7 @@ TBool newIaps( EFalse ); TBool lostIaps( EFalse ); iCache->UpdateAvailableNetworksList( - *aIapIdList, + aIapAvailabilityData, networkList, newIaps, lostIaps ); @@ -1800,6 +1826,7 @@ case EWlanStateNotConnected: DEBUG( "CWlmServer::notify() - STATE: EWlanStateNotConnected" ); iIsRoaming = EFalse; + iConnectionIapId = 0; // set icon to "not available" SetIconState( EWlmIconStatusNotAvailable ); @@ -1882,6 +1909,29 @@ case EWlmNotifyAcTrafficStatusChanged: DEBUG( "CWlmServer::notify() - STATE: EWlmNotifyAcTrafficStatusChanged" ); break; + case EWlmNotifyRcpChanged: + DEBUG( "CWlmServer::notify() - STATE: EWlmNotifyRcpChanged" ); + if( static_cast( data[0] ) == core_rcp_normal ) + { + TInt idx = iIapWeakList.Find( iConnectionIapId ); + if( idx >= 0 ) + { + DEBUG1( "CWlmServer::notify() - removing IAP %u from weak list", + iConnectionIapId ); + iIapWeakList.Remove( idx ); + } + } + else + { + TInt idx = iIapWeakList.Find( iConnectionIapId ); + if( idx == KErrNotFound ) + { + DEBUG1( "CWlmServer::notify() - adding IAP %u to weak list", + iConnectionIapId ); + iIapWeakList.Append( iConnectionIapId ); + } + } + break; default: break; } @@ -2607,9 +2657,8 @@ ScanList* scanList = reinterpret_cast( aRequest.iParam2 ); - core_type_list_c* idList = - reinterpret_cast*>( aRequest.iParam1 ); - + core_type_list_c* iapAvailabilityList = + reinterpret_cast*>( aRequest.iParam1 ); core_type_list_c* iapDataList = reinterpret_cast*>( aRequest.iParam0 ); delete iapDataList; @@ -2625,7 +2674,7 @@ if( aStatus == core_error_ok ) { - NotifyBackgroundScanDone( scanList, idList ); + NotifyBackgroundScanDone( scanList, *iapAvailabilityList ); // cache takes the ownership of the scanList scanList = NULL; } @@ -2637,8 +2686,8 @@ delete scanList; scanList = NULL; - delete idList; - idList = NULL; + delete iapAvailabilityList; + iapAvailabilityList = NULL; break; } @@ -2774,29 +2823,33 @@ // Create pointers to parameters core_type_list_c* iapSsidList; ScanList* scanList; - core_type_list_c* coreIdList; + core_type_list_c* coreAvailabilityList; core_type_list_c* iapDataList; + TBool isFiltered( reinterpret_cast( aRequest.iParam4 ) ); + DEBUG1( "CWlmServer::CompleteExternalRequest() - isFiltered: %u", + isFiltered ); iapSsidList = reinterpret_cast*>( aRequest.iParam3 ); iapDataList = reinterpret_cast*>( aRequest.iParam0 ); TUint* completedScanTime = reinterpret_cast( aRequest.iTime ); ScanList* completedScanList = reinterpret_cast( aRequest.iParam2); - core_type_list_c* completedIdList = reinterpret_cast*>( aRequest.iParam1 ); + core_type_list_c* completedAvailabilityList = + reinterpret_cast*>( aRequest.iParam1 ); if( aTriggerRequest == NULL ) { DEBUG( "CWlmServer::CompleteExternalRequest() - GetAvailableIaps request handled by core" ); scanList = reinterpret_cast( aRequest.iParam2); - coreIdList = reinterpret_cast*>( aRequest.iParam1 ); + coreAvailabilityList = reinterpret_cast*>( aRequest.iParam1 ); } else { DEBUG( "CWlmServer::CompleteExternalRequest() - GetAvailableIaps request not handled by core" ); //Use the results of the triggering request to complete also this other request scanList = reinterpret_cast( aTriggerRequest->iParam2); - coreIdList = reinterpret_cast*>( aTriggerRequest->iParam1 ); + coreAvailabilityList = reinterpret_cast*>( aTriggerRequest->iParam1 ); } delete iapSsidList; @@ -2816,27 +2869,75 @@ if( aTriggerRequest == NULL ) { iCache->UpdateAvailableNetworksList( - *coreIdList, + *coreAvailabilityList, networkList, newIaps, lostIaps ); } networkList.Close(); - TWlmAvailableIaps tmp; - TUint32* pInt = coreIdList->first(); - TInt idx = 0; - while( pInt ) + TWlmAvailableIaps tmp = { 0 }; + core_iap_availability_data_s* pInt = coreAvailabilityList->first(); + if( isFiltered ) { - DEBUG1( "CWlmServer::CompleteExternalRequest() - IAP %u is available", - *pInt ); - tmp.iaps[ idx ] = *pInt; - idx++; - pInt = coreIdList->next(); + while( pInt && tmp.count < KWlmMaxAvailableIaps ) + { + if( pInt->rcpi < iDeviceSettings.minRcpiForIapAvailability ) + { + DEBUG3( "CWlmServer::CompleteExternalRequest() - IAP %u filtered, RCPI is too weak (%u vs %u)", + pInt->id, pInt->rcpi, iDeviceSettings.minRcpiForIapAvailability ); + } + else if( iIapWeakList.Find( pInt->id ) != KErrNotFound ) + { + if( pInt->rcpi < iDeviceSettings.rcpiTrigger ) + { + DEBUG3( "CWlmServer::CompleteExternalRequest() - IAP %u filtered, in weak list and RCPI is too weak (%u vs %u)", + pInt->id, pInt->rcpi, iDeviceSettings.rcpiTrigger ); + } + else + { + DEBUG2( "CWlmServer::CompleteExternalRequest() - IAP %u is available, RCPI is %u, removed from weak list", + pInt->id, pInt->rcpi ); + tmp.iaps[tmp.count].iapId = pInt->id; + tmp.iaps[tmp.count++].rcpi = pInt->rcpi; + iIapWeakList.Remove( + iIapWeakList.Find( pInt->id ) ); + } + } + else + { + DEBUG2( "CWlmServer::CompleteExternalRequest() - IAP %u is available, RCPI is %u", + pInt->id, pInt->rcpi ); + tmp.iaps[tmp.count].iapId = pInt->id; + tmp.iaps[tmp.count++].rcpi = pInt->rcpi; + } + pInt = coreAvailabilityList->next(); + } } - - tmp.count = idx; - + else + { + while( pInt && tmp.count < KWlmMaxAvailableIaps ) + { + if( pInt->rcpi >= iDeviceSettings.rcpiTrigger && + iIapWeakList.Find( pInt->id ) != KErrNotFound ) + { + DEBUG2( "CWlmServer::CompleteExternalRequest() - IAP %u is available, RCPI is %u, removed from weak list", + pInt->id, pInt->rcpi ); + iIapWeakList.Remove( + iIapWeakList.Find( pInt->id ) ); + } + else + { + DEBUG2( "CWlmServer::CompleteExternalRequest() - IAP %u is available, RCPI is %u", + pInt->id, pInt->rcpi ); + } + + tmp.iaps[tmp.count].iapId = pInt->id; + tmp.iaps[tmp.count++].rcpi = pInt->rcpi; + pInt = coreAvailabilityList->next(); + } + } + if( IsSessionActive( aRequest ) ) { TPckg outPckg( tmp ); @@ -2844,14 +2945,14 @@ } if( aTriggerRequest == NULL ) { - DEBUG("CWlmServer::CompleteExternalRequest() - delete iapIdList" ); - delete coreIdList; + DEBUG("CWlmServer::CompleteExternalRequest() - delete coreAvailabilityList" ); + delete coreAvailabilityList; } else { // If this completed request was not the triggering request then there is no need // to cache anything. The triggering request results will be cached. - delete completedIdList; + delete completedAvailabilityList; delete completedScanList; } @@ -2872,14 +2973,14 @@ // scan failed due to some reason: not caching anything if( aTriggerRequest == NULL ) { - delete coreIdList; + delete coreAvailabilityList; delete scanList; } else { // Delete only the lists of the completed request. Triggering request lists are // deleted later on when that request is actually handled. - delete completedIdList; + delete completedAvailabilityList; delete completedScanList; } } @@ -3011,6 +3112,7 @@ TWlanAvailableNetwork network; network.ssid.Copy( ieData, ieLength ); network.securityMode = info.SecurityMode(); + network.rcpi = info.RXLevel(); if( info.OperatingMode() == WlanOperatingModeInfra ) { network.networkType = Infrastructure; @@ -3020,12 +3122,18 @@ network.networkType = Adhoc; } - if ( aNetworkList.Find( network, isEqual ) == KErrNotFound ) + TInt idx = aNetworkList.Find( network, isEqual ); + if ( idx == KErrNotFound ) { DEBUG1S( "CWlmServer::GetNetworkList() - appending SSID ", ieLength, ieData ); aNetworkList.Append( network ); } + else if( idx >= 0 && + aNetworkList[idx].rcpi < network.rcpi ) + { + aNetworkList[idx].rcpi = network.rcpi; + } } } @@ -3418,8 +3526,9 @@ iapList.Close(); // Create output list - core_type_list_c* iapIdList = new core_type_list_c; - if( iapIdList == NULL ) + core_type_list_c* iapAvailabilityList = + new core_type_list_c; + if( iapAvailabilityList == NULL ) { DEBUG( "ERROR: Out of memory" ); delete iapDataList; @@ -3434,7 +3543,7 @@ DEBUG( "CWlmServer::BackgroundScanRequest() - Out of memory when instantiating ScanList" ); delete iapDataList; delete iapSsidList; - delete iapIdList; + delete iapAvailabilityList; return KErrNoMemory; } @@ -3446,7 +3555,7 @@ delete iapDataList; delete iapSsidList; - delete iapIdList; + delete iapAvailabilityList; delete scanList; return KErrNoMemory; } @@ -3457,12 +3566,13 @@ mapEntry.iRequestId = KWlanIntCmdBackgroundScan; mapEntry.iSessionId = 0; mapEntry.iParam0 = iapDataList; - mapEntry.iParam1 = iapIdList; + mapEntry.iParam1 = iapAvailabilityList; mapEntry.iParam2 = scanList; mapEntry.iParam3 = iapSsidList; + mapEntry.iParam4 = reinterpret_cast( EFalse ); mapEntry.iTime = scanTime; iRequestMap.Append( mapEntry ); - + if( IsOnlyTimedScanRequestInRequestMap( mapEntry ) || *scanTime < iScanSchedulingTimerExpiration ) { // Scan scheduling timer needs to be set again because this request needs the results earlier @@ -3558,7 +3668,8 @@ DEBUG( "CWlmServer::ScanSchedulingTimerExpired() - GetAvailableIaps requested" ); core_type_list_c* iapDataList = reinterpret_cast*>( self->iRequestMap[index].iParam0 ); - core_type_list_c* iapIdList = reinterpret_cast*>( self->iRequestMap[index].iParam1 ); + core_type_list_c* iapAvailabilityList = + reinterpret_cast*>( self->iRequestMap[index].iParam1 ); ScanList* scanList = reinterpret_cast( self->iRequestMap[index].iParam2 ); core_type_list_c* iapSsidList = reinterpret_cast*>( self->iRequestMap[index].iParam3 ); TUint* scanTime = reinterpret_cast( self->iRequestMap[index].iTime ); @@ -3579,8 +3690,8 @@ delete iapDataList; iapDataList = NULL; - delete iapIdList; - iapIdList = NULL; + delete iapAvailabilityList; + iapAvailabilityList = NULL; delete scanList; scanList = NULL; delete iapSsidList; @@ -3629,14 +3740,15 @@ // pass request to core core_type_list_c* iapDataList = reinterpret_cast*>( self->iRequestMap[index].iParam0 ); core_type_list_c* iapSsidList = reinterpret_cast*>( self->iRequestMap[index].iParam3 ); - core_type_list_c* iapIdList = reinterpret_cast*>( self->iRequestMap[index].iParam1 ); + core_type_list_c* iapAvailabilityList = + reinterpret_cast*>( self->iRequestMap[index].iParam1 ); ScanList* scanList = reinterpret_cast( self->iRequestMap[index].iParam2 ); self->iCoreServer->get_available_iaps( self->iRequestMap[index].iRequestId, isActiveScanAllowed, *iapDataList, - *iapIdList, + *iapAvailabilityList, iapSsidList, *scanList ); @@ -3668,14 +3780,15 @@ // pass request to core core_type_list_c* iapDataList = reinterpret_cast*>( self->iRequestMap[index].iParam0 ); core_type_list_c* iapSsidList = reinterpret_cast*>( self->iRequestMap[index].iParam3 ); - core_type_list_c* iapIdList = reinterpret_cast*>( self->iRequestMap[index].iParam1 ); + core_type_list_c* iapAvailabilityList = + reinterpret_cast*>( self->iRequestMap[index].iParam1 ); ScanList* scanList = reinterpret_cast( self->iRequestMap[index].iParam2 ); self->iCoreServer->get_available_iaps( self->iRequestMap[index].iRequestId, isActiveScanAllowed, *iapDataList, - *iapIdList, + *iapAvailabilityList, iapSsidList, *scanList ); @@ -4077,7 +4190,7 @@ DEBUG( "CWlmServer::CancelScan() - remove entry from request map" ); SRequestMapEntry entry = iRequestMap[index]; delete reinterpret_cast*>( entry.iParam0 ); - delete reinterpret_cast*>( entry.iParam1 ); + delete reinterpret_cast*>( entry.iParam1 ); delete reinterpret_cast( entry.iParam2); delete reinterpret_cast*>( entry.iParam3 ); delete reinterpret_cast( entry.iTime ); @@ -4114,7 +4227,7 @@ DEBUG( "CWlmServer::CancelScan() - remove entry from request map" ); SRequestMapEntry entry = iRequestMap[index]; delete reinterpret_cast*>( entry.iParam0 ); - delete reinterpret_cast*>( entry.iParam1 ); + delete reinterpret_cast*>( entry.iParam1 ); delete reinterpret_cast( entry.iParam2); delete reinterpret_cast*>( entry.iParam3 ); delete reinterpret_cast( entry.iTime ); @@ -5016,8 +5129,8 @@ ScanList* scanList = reinterpret_cast( aMapEntry.iParam2 ); - core_type_list_c* iapIdList = - reinterpret_cast*>( aMapEntry.iParam1 ); + core_type_list_c* iapAvailabilityList = + reinterpret_cast*>( aMapEntry.iParam1 ); /** * Go through the IAP list and find IAPs that haven't been found @@ -5026,14 +5139,14 @@ RArray attachedIapList; CleanupClosePushL( attachedIapList ); const RArray& cachedIapList( - iCache->CachedIapDataList() ); - core_type_list_iterator_c iter( *iapIdList ); + iCache->CachedIapDataList() ); + core_type_list_iterator_c iter( *iapAvailabilityList ); for( TInt idx( 0 ); idx < cachedIapList.Count(); ++idx ) { TBool isFound( EFalse ); - for( u32_t* item = iter.first(); !isFound && item; item = iter.next() ) + for( core_iap_availability_data_s* item = iter.first(); !isFound && item; item = iter.next() ) { - if( *item == cachedIapList[idx].iapId ) + if( item->id == cachedIapList[idx].iapId ) { isFound = ETrue; } @@ -5080,11 +5193,13 @@ attachedIapList[idx].iapId, *ssidList ); TBool isMatch( EFalse ); + TUint rcpi( 0 ); for( TInt iidx( 0 ); !isMatch && iidx < networkList.Count(); ++iidx ) { if( attachedIapList[idx].networkType == networkList[iidx].networkType && ssidList->IsInList( networkList[iidx].ssid ) ) { + rcpi = networkList[iidx].rcpi; isMatch = ETrue; } } @@ -5096,10 +5211,16 @@ /** * A match has been found, mark the IAP as available. */ - u32_t* iapId = new (ELeave) u32_t( - attachedIapList[idx].iapId ); - iapIdList->append( - iapId ); + core_iap_availability_data_s* data = new (ELeave) core_iap_availability_data_s; + data->id = attachedIapList[idx].iapId; + data->rcpi = rcpi; + core_error_e ret = iapAvailabilityList->append( + data ); + if( ret != core_error_ok ) + { + delete data; + } + data = NULL; } else { diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacContextImpl.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacContextImpl.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacContextImpl.h Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 106 % +* %version: 107 % */ #ifndef WLANCONTEXTIMPL_H @@ -1310,11 +1310,13 @@ * @param aQueueId Id of the queue/AC via which the frame will be * transmitted * @param aEtherType Ethernet type of the frame + * @param aDot11FrameType 802.11 frame type * @return To which power management mode to change; if any at all */ inline TPowerMgmtModeChange OnFrameTx( WHA::TQueueId aQueueId, - TUint16 aEtherType ); + TUint16 aEtherType, + T802Dot11FrameControlTypeMask aDot11FrameType = E802Dot11FrameTypeData ); /** * To be called when accepting an Rx frame @@ -1333,6 +1335,16 @@ TDaType aDaType ); /** + * To be called when receiving the PS Mode Error indication + * + * Informs Dynamic Power Mode Manager about the indication. + * Determines the need to make a power mode transition. + * + * @return To which power management mode to change; if any at all + */ + inline TPowerMgmtModeChange OnPsModeErrorIndication(); + + /** * Sets the dynamic power mode transition algorithm parameters * * @since S60 3.1 @@ -1415,6 +1427,12 @@ inline void FreezePwrModeMgmtTrafficOverride(); /** + * Restores the Active mode parameters of dynamic power mode management + * back to their WLAN Mgmt Client provided values + */ + inline void RestorePwrModeMgmtParameters(); + + /** * To be called upon Active to Light PS timer timeout * * @since S60 v5.1 @@ -1760,7 +1778,15 @@ * * @since S60 3.2 */ - void OnKeepAliveTimerTimeout(); + inline void OnKeepAliveTimerTimeout(); + + /** + * Are we currently in Voice over WLAN Call state + * + * @return ETrue if we are + * EFalse if we are not + */ + inline TBool InVoiceCallState() const; /** * Insert new RCPI value into the Signal Predictor. @@ -1804,13 +1830,27 @@ WHA::TRcpi aRcpiWarnLevel ); /** - * Adds a WLAN feature supported by us to the list of those supported - * features which are indicated in BSS membership selector + * Adds the specified WLAN feature supported by us to the list of those + * supported features which are indicated in BSS membership selector * * @param aFeature Feature to add */ void AddBssMembershipFeature( T802Dot11BssMembershipSelector aFeature ); - + + /** + * Removes the specified WLAN feature from our list of those supported + * features which are indicated in BSS membership selector + * + * @param aFeature Feature to remove + */ + void RemoveBssMembershipFeature( TUint8 aItem ); + + /** + * Clears (i.e. makes empty) our list of features which are indicated + * in BSS membership selector + */ + inline void ClearBssMembershipFeatureList(); + /** * Checks if the specified item is a WLAN feature indicated in BSS * membership selector and if it is supported by us diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacContextImpl.inl --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacContextImpl.inl Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacContextImpl.inl Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 78 % +* %version: 79 % */ #include "umacconnectcontext.h" @@ -1610,9 +1610,13 @@ // inline TPowerMgmtModeChange WlanContextImpl::OnFrameTx( WHA::TQueueId aQueueId, - TUint16 aEtherType ) + TUint16 aEtherType, + T802Dot11FrameControlTypeMask aDot11FrameType ) { - return iDynamicPowerModeCntx.OnFrameTx( aQueueId, aEtherType ); + return iDynamicPowerModeCntx.OnFrameTx( + aQueueId, + aEtherType, + aDot11FrameType ); } // --------------------------------------------------------------------------- @@ -1636,6 +1640,15 @@ // // --------------------------------------------------------------------------- // +inline TPowerMgmtModeChange WlanContextImpl::OnPsModeErrorIndication() + { + return iDynamicPowerModeCntx.OnPsModeErrorIndication(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// inline void WlanContextImpl::SetPowerModeManagementParameters( TUint32 aToLightPsTimeout, TUint16 aToLightPsFrameThreshold, @@ -1693,6 +1706,15 @@ // // --------------------------------------------------------------------------- // +inline void WlanContextImpl::RestorePwrModeMgmtParameters() + { + iDynamicPowerModeCntx.RestoreActiveModeParameters(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// inline TBool WlanContextImpl::OnActiveToLightPsTimerTimeout() { return iDynamicPowerModeCntx.OnActiveToLightPsTimerTimeout(); @@ -2059,6 +2081,15 @@ // // --------------------------------------------------------------------------- // +inline TBool WlanContextImpl::InVoiceCallState() const + { + return iNullSendController.InVoiceCallState(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// inline TBool WlanContextImpl::InsertNewRcpiIntoPredictor( TInt64 aTimestamp, WHA::TRcpi aRcpi ) @@ -2100,6 +2131,18 @@ aRcpiWarnLevel ); } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +inline void WlanContextImpl::ClearBssMembershipFeatureList() + { + os_memset( + &iOurBssMembershipFeatureArray, + KUnallocated, + sizeof( iOurBssMembershipFeatureArray ) ); + } + // --------------------------------------------------------------------------- // // --------------------------------------------------------------------------- diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacDot11InfrastructureMode.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacDot11InfrastructureMode.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacDot11InfrastructureMode.h Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 34 % +* %version: 35 % */ #ifndef WLANDOT11INFRASTRUCTUREMODE_H @@ -274,14 +274,6 @@ WHA::TRcpi aRcpi ); /** - * Indicates that the WLAN device has detected problems in the power - * save mode operation of the AP - * - * @param aCtxImpl global statemachine context - */ - virtual void DoPsModeErrorIndication( WlanContextImpl& aCtxImpl ); - - /** * Voice Call Entry timer timeout function * * @since S60 v3.2 diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacDot11State.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacDot11State.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacDot11State.h Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 58 % +* %version: 59 % */ #ifndef WLANDOT11STATE_H @@ -314,14 +314,18 @@ /** - * + * Determines if it is possible to try to connect to the target nw * * @since S60 3.2 * @param aCtxImpl statemachine context - * @param - * @return ETrue if ... + * @param aScanResponseFrameBodyLength Length of the WLAN Mgmt Client + * provided scan response frame body received from the target nw + * @param aScanResponseFrameBody The WLAN Mgmt Client provided scan + * response frame body received from the target nw + * @return KErrNone if it is possible to try to connect to the target nw + * An error code otherwise */ - TBool InitNetworkConnect( + TInt InitNetworkConnect( WlanContextImpl& aCtxImpl, TUint16 aScanResponseFrameBodyLength, const TUint8* aScanResponseFrameBody ) const; @@ -697,8 +701,11 @@ static TBool NetworkCapabilityInformationMet( WlanContextImpl& aCtxImpl ); - static TBool AreSupportedRatesMet( WlanContextImpl& aCtxImpl, - TBool aCheckAlsoExtendedRates ); + + static TBool AreSupportedRatesMet( + WlanContextImpl& aCtxImpl, + TBool aCheckAlsoExtendedRates ); + static TBool ProcessSingleSupportedRateElement( WlanContextImpl& aCtxImpl, const TUint8 aApRate, diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacDot11Synchronize.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacDot11Synchronize.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacDot11Synchronize.h Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 19 % +* %version: 20 % */ #ifndef WLANDOT11SYNCHRONIZE_H @@ -105,8 +105,7 @@ WlanContextImpl& aCtxImpl, TState aNewState ); - TBool InitActions( - WlanContextImpl& aCtxImpl ); + TInt InitActions( WlanContextImpl& aCtxImpl ) const; void SetDot11SlotTime( WlanContextImpl& aCtxImpl ); @@ -209,8 +208,8 @@ TState iState; - // true, if the Join operation failed - TBool iJoinFailed; + /** status of the Join operation */ + TInt iJoinStatus; #ifndef NDEBUG // max length of state name for tracing diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umac_types.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umac_types.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umac_types.h Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 29 % +* %version: 30 % */ #ifndef UMACTYPES_H @@ -56,7 +56,9 @@ EPsModeError } TIndication; - +/** Connect failed because of unsupported network configuration */ +const TInt KWlanErrUnsupportedNwConf = -333001; + /** * Maximum length of an SSID in BYTES */ diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacactivemodepowermodemgr.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacactivemodepowermodemgr.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacactivemodepowermodemgr.h Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 9 % +* %version: 10 % */ #ifndef WLAN_ACTIVE_MODE_POWER_MODE_MGR @@ -26,13 +26,22 @@ class WlanContextImpl; + /** * Class implementing infrastructure mode dynamic power mode management * algorithm for Active mode (CAM) */ class WlanActiveModePowerModeMgr : public WlanPowerModeMgrBase - { - + { + +public: + /** + * Default Rx/Tx frame count threshold for considering change to Light + * PS mode. + * This value is used if another value hasn't been provided + */ + static const TUint KDefaultToLightPsFrameThreshold = 1; + public: /** Ctor */ @@ -62,6 +71,7 @@ * @param aCtxImpl global statemachine context * @param aQueueId Id of the queue/AC via which the frame will be transmitted * @param aEtherType Ethernet type of the frame + * @param aDot11FrameType 802.11 frame type * @param aIgnoreThisFrame shall this frame be ignored from dynamic power * mode management perspective * @return To which power management mode to change; if any at all @@ -70,6 +80,7 @@ WlanContextImpl& aCtxImpl, WHA::TQueueId aQueueId, TUint16 aEtherType, + T802Dot11FrameControlTypeMask aDot11FrameType, TBool aIgnoreThisFrame ); /** diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacactivemodepowermodemgr.inl --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacactivemodepowermodemgr.inl Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacactivemodepowermodemgr.inl Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 4 % +* %version: 5 % */ // ----------------------------------------------------------------------------- @@ -27,6 +27,15 @@ TUint aToLightPsFrameThreshold, TUint16 aUapsdRxFrameLengthThreshold ) { + OsTracePrint( KPwrStateTransition, (TUint8*) + ("UMAC: WlanActiveModePowerModeMgr::SetParameters: " + "aToLightPsFrameThreshold: %d"), + aToLightPsFrameThreshold ); + OsTracePrint( KPwrStateTransition, (TUint8*) + ("UMAC: WlanActiveModePowerModeMgr::SetParameters: " + "aUapsdRxFrameLengthThreshold: %d"), + aUapsdRxFrameLengthThreshold ); + iToLightPsFrameThreshold = aToLightPsFrameThreshold; iUapsdRxFrameLengthThreshold = aUapsdRxFrameLengthThreshold; } diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdeeppsmodepowermodemgr.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdeeppsmodepowermodemgr.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdeeppsmodepowermodemgr.h Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 3 % +* %version: 4 % */ #ifndef WLAN_DEEP_PS_MODE_POWER_MODE_MGR @@ -42,6 +42,14 @@ virtual ~WlanDeepPsModePowerModeMgr(); /** + * Sets the dynamic power mode transition algorithm parameters + * + * @param aUapsdRxFrameLengthThreshold received frame + * payload length (in bytes) threshold in U-APSD network + */ + void SetParameters( TUint16 aUapsdRxFrameLengthThreshold ); + + /** * To be called when transmitting a frame * * @since S60 5.1 @@ -49,6 +57,7 @@ * @param aCtxImpl global statemachine context * @param aQueueId Id of the queue/AC via which the frame will be transmitted * @param aEtherType Ethernet type of the frame + * @param aDot11FrameType 802.11 frame type * @param aIgnoreThisFrame shall this frame be ignored from dynamic power * mode management perspective * @return To which power management mode to change; if any at all @@ -57,6 +66,7 @@ WlanContextImpl& aCtxImpl, WHA::TQueueId aQueueId, TUint16 aEtherType, + T802Dot11FrameControlTypeMask aDot11FrameType, TBool aIgnoreThisFrame ); /** @@ -80,6 +90,15 @@ TUint aPayloadLength, TDaType aDaType ); + /** + * From WlanPowerModeMgrBase + * To be called upon receiving the PS Mode Error indication + * Determines the need to make a power mode transition + * + * @return To which power management mode to change; if any at all + */ + virtual TPowerMgmtModeChange OnPsModeErrorIndication(); + /** * From WlanPowerModeMgrBase * Resets the state of the object diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdot11infrastructurenormalmode.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdot11infrastructurenormalmode.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdot11infrastructurenormalmode.h Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 10 % +* %version: 11 % */ #ifndef C_WLANDOT11INFRASTRUCTURENORMALMODE_H @@ -54,6 +54,16 @@ WlanContextImpl& aCtxImpl ); /** + * Indicates that the WLAN device has detected problems in the power + * save mode operation of the AP + * + * @param aCtxImpl global statemachine context + * @return ETrue if a state change occurred in the state machine + * EFalse otherwise + */ + virtual void DoPsModeErrorIndication( WlanContextImpl& aCtxImpl ); + + /** * Active to Light PS timer timeout function * * @since S60 v5.1 diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdynamicpowermodemgmtcntx.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdynamicpowermodemgmtcntx.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdynamicpowermodemgmtcntx.h Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 12 % +* %version: 14 % */ #ifndef WLAN_DYNAMIC_POWER_MODE_MGMT_CNTX @@ -66,11 +66,13 @@ * @since S60 3.1 * @param aQueueId Id of the queue/AC via which the frame will be transmitted * @param aEtherType Ethernet type of the frame + * @param aDot11FrameType 802.11 frame type * @return To which power management mode to change; if any at all */ TPowerMgmtModeChange OnFrameTx( WHA::TQueueId aQueueId, - TUint16 aEtherType ); + TUint16 aEtherType, + T802Dot11FrameControlTypeMask aDot11FrameType ); /** * To be called when accepting an Rx frame @@ -89,6 +91,14 @@ TDaType aDaType ); /** + * To be called upon receiving the PS Mode Error indication + * Determines the need to make a power mode transition + * + * @return To which power management mode to change; if any at all + */ + TPowerMgmtModeChange OnPsModeErrorIndication(); + + /** * To be called upon Active to Light PS timer timeout * * @since S60 v5.1 @@ -194,6 +204,12 @@ */ void FreezeTrafficOverride(); + /** + * Restores the Active mode parameters back to their WLAN Mgmt Client + * provided values + */ + inline void RestoreActiveModeParameters(); + private: /** @@ -322,7 +338,25 @@ * @return ETrue if Background AC traffic shall be ignored */ inline TBool StayInPsDespiteLegacyBackgroundTraffic() const; - + + /** + * Sets special parameters for the Active mode. + * To be used when switching to Active upen receiving PsModeError + * indication from WHA layer. + * The Wlan Mgmt Client provided Active mode parameters can be restored + * with RestoreActiveModeParameters() + */ + inline void SetPsModeErrorActiveModeParameters(); + + /** + * Sets special parameters for the Active mode. + * To be used when switching to Active upon transmitting our keep alive + * frame or an ARP frame. + * The Wlan Mgmt Client provided Active mode parameters can be restored + * with RestoreActiveModeParameters() + */ + inline void SetKeepAliveActiveModeParameters(); + // Prohibit copy constructor WlanDynamicPowerModeMgmtCntx( const WlanDynamicPowerModeMgmtCntx& ); @@ -331,7 +365,15 @@ ( const WlanDynamicPowerModeMgmtCntx& ); private: // Data - + + /** for backing up the parameters related to Active mode */ + struct SActiveParamsBackup + { + TUint32 iToLightPsTimeout; + TUint16 iToLightPsFrameThreshold; + TUint16 iUapsdRxFrameLengthThreshold; + }; + /** flag value to store state transition need internally */ TBool iStateChange; /** stores the flags defined below */ @@ -383,18 +425,27 @@ /** ToDeepPsTimer started */ static const TUint32 KToDeepPsTimerStarted = ( 1 << 10 ); - // time interval in microseconds after which transition from Active - // mode to Light PS mode is considered. + /** + * time interval in microseconds after which transition from Active + * mode to Light PS mode is considered. + */ TUint32 iToLightPsTimeout; - // time interval in microseconds after which the frame counter - // used when considering transition from Light PS to Active mode is reset. + /** + * time interval in microseconds after which the frame counter + * used when considering transition from Light PS to Active mode is reset. + */ TUint32 iToActiveTimeout; - // time interval in microseconds after which transition from Light PS - // mode to Deep PS mode is considered. + /** + * time interval in microseconds after which transition from Light PS + * mode to Deep PS mode is considered. + */ TUint32 iToDeepPsTimeout; - + + /** for backing up the parameters related to Active mode */ + SActiveParamsBackup iActiveParamsBackup; + /** currently active power management mode context */ WlanPowerModeMgrBase* iActiveCntx; /** context for active mode */ diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdynamicpowermodemgmtcntx.inl --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdynamicpowermodemgmtcntx.inl Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacdynamicpowermodemgmtcntx.inl Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 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" @@ -16,9 +16,21 @@ */ /* -* %version: 5 % +* %version: 6 % */ +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +inline void WlanDynamicPowerModeMgmtCntx::RestoreActiveModeParameters() + { + iToLightPsTimeout = iActiveParamsBackup.iToLightPsTimeout; + iActiveModeCntx.SetParameters( + iActiveParamsBackup.iToLightPsFrameThreshold, + iActiveParamsBackup.iUapsdRxFrameLengthThreshold ); + } + // ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- @@ -109,3 +121,37 @@ { return ( iFlags & KStayInPsDespiteLegacyBackgroundTraffic ); } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +inline void WlanDynamicPowerModeMgmtCntx::SetPsModeErrorActiveModeParameters() + { + const TUint32 KToLightPsTimeout( 1000000 ); // 1 second + const TUint16 KToLightPsFrameThreshold( 4 ); + const TUint16 KUapsdRxFrameLengthThreshold( + WlanPowerModeMgrBase::KDefaultUapsdRxFrameLengthThreshold ); + + iToLightPsTimeout = KToLightPsTimeout; + iActiveModeCntx.SetParameters( + KToLightPsFrameThreshold, + KUapsdRxFrameLengthThreshold ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +inline void WlanDynamicPowerModeMgmtCntx::SetKeepAliveActiveModeParameters() + { + const TUint32 KToLightPsTimeout( 20000 ); // 20ms + const TUint16 KToLightPsFrameThreshold( 1 ); + const TUint16 KUapsdRxFrameLengthThreshold( + WlanPowerModeMgrBase::KDefaultUapsdRxFrameLengthThreshold ); + + iToLightPsTimeout = KToLightPsTimeout; + iActiveModeCntx.SetParameters( + KToLightPsFrameThreshold, + KUapsdRxFrameLengthThreshold ); + } diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umaclightpsmodepowermodemgr.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umaclightpsmodepowermodemgr.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umaclightpsmodepowermodemgr.h Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 3 % +* %version: 4 % */ #ifndef WLAN_LIGHT_PS_MODE_POWER_MODE_MGR @@ -65,6 +65,7 @@ * @param aCtxImpl global statemachine context * @param aQueueId Id of the queue/AC via which the frame will be transmitted * @param aEtherType Ethernet type of the frame + * @param aDot11FrameType 802.11 frame type * @param aIgnoreThisFrame shall this frame be ignored from dynamic power * mode management perspective * @return To which power management mode to change; if any at all @@ -73,6 +74,7 @@ WlanContextImpl& aCtxImpl, WHA::TQueueId aQueueId, TUint16 aEtherType, + T802Dot11FrameControlTypeMask aDot11FrameType, TBool aIgnoreThisFrame ); /** @@ -98,6 +100,15 @@ /** * From WlanPowerModeMgrBase + * To be called upon receiving the PS Mode Error indication + * Determines the need to make a power mode transition + * + * @return To which power management mode to change; if any at all + */ + virtual TPowerMgmtModeChange OnPsModeErrorIndication(); + + /** + * From WlanPowerModeMgrBase * To be called upon Light PS to Active timer timeout * * @since S60 5.1 diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacnullsendcontroller.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacnullsendcontroller.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacnullsendcontroller.h Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 14 % +* %version: 15 % */ #ifndef WLAN_NULL_SEND_CONTROLLER @@ -172,6 +172,14 @@ * @since S60 3.2 */ void OnKeepAliveTimerTimeout(); + + /** + * Are we currently in Voice over WLAN Call state + * + * @return ETrue if we are + * EFalse if we are not + */ + inline TBool InVoiceCallState() const; private: diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacnullsendcontroller.inl --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacnullsendcontroller.inl Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacnullsendcontroller.inl Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007-2010 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" @@ -17,7 +17,7 @@ */ /* -* %version: 10 % +* %version: 11 % */ // Default Voice Call Entry timeout @@ -38,7 +38,7 @@ // Default Keep Alive timeout // This value is used if no other value has been provided -const TUint32 KDefaultKeepAliveTimeout = 200000000; // 200 s +const TUint32 KDefaultKeepAliveTimeout = 60000000; // 60 s // Default value for frame payload length threashold of a potential // carrier of downlink Voice over WLAN Call data, which is erroneously @@ -221,3 +221,12 @@ // during a Voice Call } } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +inline TBool WlanNullSendController::InVoiceCallState() const + { + return static_cast(iFlags & KInVoiceCallState); + } diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacpowermodemgrbase.h --- a/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacpowermodemgrbase.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/umacpowermodemgrbase.h Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 12 % +* %version: 13 % */ #ifndef WLAN_POWER_MODE_MGR_BASE_H @@ -32,6 +32,7 @@ class WlanContextImpl; + /** * Common base class for classes implementing dynamic power mode transition * algorithm between PS and active mode in infrastructure mode @@ -39,6 +40,10 @@ class WlanPowerModeMgrBase { public: + // Default frame payload length threshold value (in bytes) for U-APSD + static const TUint32 KDefaultUapsdRxFrameLengthThreshold = 400; + +public: /** Dtor */ virtual ~WlanPowerModeMgrBase(); @@ -51,6 +56,7 @@ * @param aCtxImpl global statemachine context * @param aQueueId Id of the queue/AC via which the frame will be transmitted * @param aEtherType Ethernet type of the frame + * @param aDot11FrameType 802.11 frame type * @param aIgnoreThisFrame shall this frame be ignored from dynamic power * mode management perspective * @return To which power management mode to change; if any at all @@ -59,6 +65,7 @@ WlanContextImpl& aCtxImpl, WHA::TQueueId aQueueId, TUint16 aEtherType, + T802Dot11FrameControlTypeMask aDot11FrameType, TBool aIgnoreThisFrame ) = 0; /** @@ -83,6 +90,14 @@ TDaType aDaType ) = 0; /** + * To be called upon receiving the PS Mode Error indication + * Determines the need to make a power mode transition + * + * @return To which power management mode to change; if any at all + */ + virtual TPowerMgmtModeChange OnPsModeErrorIndication(); + + /** * To be called upon Active to Light PS timer timeout * * @since S60 v5.1 diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacContextImpl.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacContextImpl.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacContextImpl.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 72 % +* %version: 73 % */ #include "config.h" @@ -104,10 +104,7 @@ os_memset( &iWHASettings, 0, sizeof( iWHASettings ) ); - os_memset( - &iOurBssMembershipFeatureArray, - KUnallocated, - sizeof( iOurBssMembershipFeatureArray ) ); + ClearBssMembershipFeatureList(); os_memset( &iHtBlockAckConfigure, @@ -1770,6 +1767,34 @@ // // ----------------------------------------------------------------------------- // +void WlanContextImpl::RemoveBssMembershipFeature( TUint8 aItem ) + { + TUint8 i ( 0 ); + + do + { + if ( aItem == iOurBssMembershipFeatureArray[i] ) + { + iOurBssMembershipFeatureArray[i] = KUnallocated; + + OsTracePrint( KUmacDetails, (TUint8*) + ("UMAC: WlanContextImpl::RemoveBssMembershipFeature: " + "feature %d removed"), + aItem ); + + break; + } + else + { + ++i; + } + } while ( i != KMaxNumOfWlanFeatures ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// TBool WlanContextImpl::BssMembershipFeatureSupported( TUint8 aItem ) const { TBool supported ( EFalse ); diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11Associated.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11Associated.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11Associated.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 96.1.1 % +* %version: 96.1.2 % */ #include "config.h" @@ -1996,7 +1996,7 @@ const TPowerMgmtModeChange KPowerMgmtModeChange ( aCtxImpl.OnFrameTx( queue_id, etherType ) ); - // if any change change is needed regarding our power mgmt mode, + // if any change is needed regarding our power mgmt mode, // proceed with it stateChange = PowerMgmtModeChange( aCtxImpl, KPowerMgmtModeChange ); } @@ -2236,7 +2236,7 @@ if ( aPowerMgmtModeChange == EToActive ) { - aCtxImpl.DesiredDot11PwrMgmtMode( WHA::KPsDisable ); + aCtxImpl.DesiredDot11PwrMgmtMode( WHA::KPsDisable ); } else if ( aPowerMgmtModeChange == EToLightPs ) { diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11Idle.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11Idle.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11Idle.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 42 % +* %version: 43 % */ #include "config.h" @@ -315,13 +315,14 @@ aCtxImpl.IeData( aIeData ); aCtxImpl.IeDataLength( aIeDataLength ); + TInt status(KErrNone); // check do we meet the requirements for the network // and construct necessary objects for establishing the connection - if ( InitNetworkConnect( + if ( ( status = InitNetworkConnect( aCtxImpl, aScanResponseFrameBodyLength, - aScanResponseFrameBody ) ) + aScanResponseFrameBody ) ) == KErrNone ) { // continue @@ -350,7 +351,7 @@ { // abort ret = EFalse; - OnOidComplete( aCtxImpl, KErrGeneral ); + OnOidComplete( aCtxImpl, status ); } return ret; diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11InfrastructureMode.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11InfrastructureMode.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11InfrastructureMode.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 63 % +* %version: 64 % */ #include "config.h" @@ -788,19 +788,6 @@ // // --------------------------------------------------------------------------- // -void WlanDot11InfrastructureMode::DoPsModeErrorIndication( - WlanContextImpl& aCtxImpl ) - { - OsTracePrint( KWlmIndication, (TUint8*) - ("UMAC: WlanDot11InfrastructureMode::DoPsModeErrorIndication") ); - - OnInDicationEvent( aCtxImpl, EPsModeError ); - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// TBool WlanDot11InfrastructureMode::OnVoiceCallEntryTimerTimeout( WlanContextImpl& aCtxImpl ) { @@ -925,6 +912,7 @@ TUint32 lengthOfFrame( 0 ); T802Dot11FrameControlTypeMask frameType( E802Dot11FrameTypeDataNull ); + WHA::TQueueId queue_id( WHA::ELegacy ); // copy Null Data frame to tx-buffer to correct offset // client doesn't need to take care of the tx buffer header space @@ -972,7 +960,7 @@ } // determine Tx queue - const WHA::TQueueId queue_id( QueueId( aCtxImpl, start_of_frame ) ); + queue_id = QueueId( aCtxImpl, start_of_frame ); // send the Null Data frame by pushing it to packet scheduler aCtxImpl.PushPacketToPacketScheduler( @@ -982,13 +970,24 @@ frameType, NULL, EFalse, - EFalse ); + EFalse, + ETrue ); } else { // we didn't get a Tx buffer so we can't submit a frame send request. status = EFalse; } - + + TUint16 KetherType( 0 ); // N/A in this case + // check if we need to change power mgmt mode; no matter whether we + // actually managed to send a frame or not + const TPowerMgmtModeChange KPowerMgmtModeChange ( + aCtxImpl.OnFrameTx( queue_id, KetherType, frameType ) ); + + // if any change is needed regarding our power mgmt mode, + // proceed with it + PowerMgmtModeChange( aCtxImpl, KPowerMgmtModeChange ); + return status; } diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11SoftReset.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11SoftReset.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11SoftReset.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 28 % +* %version: 29 % */ #include "config.h" @@ -137,6 +137,7 @@ // we are breaking an existing join so we have to reset some // state variables and settings aCtxImpl.CurrentDot11PwrMgmtMode( WHA::KPsDisable ); + aCtxImpl.RestorePwrModeMgmtParameters(); aCtxImpl.Reassociate( EFalse ); aCtxImpl.QosEnabled( EFalse ); aCtxImpl.UapsdEnabled( EFalse ); diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11State.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11State.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11State.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 86.1.1 % +* %version: 86.1.3 % */ #include "config.h" @@ -3241,14 +3241,24 @@ // // ----------------------------------------------------------------------------- // -TBool WlanDot11State::InitNetworkConnect( +TInt WlanDot11State::InitNetworkConnect( WlanContextImpl& aCtxImpl, TUint16 aScanResponseFrameBodyLength, const TUint8* aScanResponseFrameBody ) const { OsTracePrint( KUmacDetails, (TUint8*)("UMAC: WlanDot11State::InitNetworkConnect") ); - + + // 1st clear our BSS Membership feature list + aCtxImpl.ClearBssMembershipFeatureList(); + + if ( aCtxImpl.WHASettings().iCapability & WHA::SSettings::KHtOperation ) + { + // wlanpdd indicates HT support. Record that in our BSS Membership + // features + aCtxImpl.AddBssMembershipFeature( E802Dot11HtPhy ); + } + const SScanResponseFixedFields* scanResponseFixedFields = reinterpret_cast( aScanResponseFrameBody ); @@ -3283,7 +3293,7 @@ OsTracePrint( KWarningLevel, (TUint8*) ("UMAC: WlanDot11State::InitNetworkConnect: WAPI requested but not supported by wlanpdd -> abort") ); - return EFalse; + return KErrNotSupported; } //============================================= @@ -3297,12 +3307,9 @@ OsTracePrint( KWarningLevel, (TUint8*) ("UMAC: WlanDot11State::InitNetworkConnect: network capabilities not met -> abort") ); - return EFalse; + return KWlanErrUnsupportedNwConf; } - // network capabilities are met -> proceed - - // initialize element locator for locating IEs from the scan response // frame body WlanElementLocator elementLocator( @@ -3312,69 +3319,7 @@ TUint8 elementDatalength( 0 ); const TUint8* elementData( NULL ); - - //============================================= - // do we meet mandatory network rates - //============================================= - - // locate supported rates IE - if ( elementLocator.InformationElement( - E802Dot11SupportedRatesIE, - elementDatalength, - &elementData ) == WlanElementLocator::EWlanLocateOk ) - { - // ...and store it to our context - aCtxImpl.GetApSupportedRatesIE().SetIeData( - elementData, - elementDatalength ); - } - else - { - OsTracePrint( KWarningLevel, (TUint8*) - ("UMAC: WlanDot11State::InitNetworkConnect: supported rates IE not found -> abort") ); - - return EFalse; - } - - // locate extended supported rates information element - if ( elementLocator.InformationElement( - E802Dot11ExtendedRatesIE, - elementDatalength, - &elementData ) == WlanElementLocator::EWlanLocateOk ) - { - OsTracePrint( KInfoLevel, (TUint8*) - ("UMAC: WlanDot11State::InitNetworkConnect: E802Dot11ExtendedRatesIE present") ); - - // ...and store it to our context - aCtxImpl.GetApExtendedSupportedRatesIE().SetIeData( elementData, elementDatalength ); - - // check if we meet mandatory rates; in this case check also extended supported rates - if ( !AreSupportedRatesMet( aCtxImpl, ETrue ) ) - { - OsTracePrint( KWarningLevel, (TUint8*) - ("UMAC: WlanDot11State::InitNetworkConnect: rates not met -> abort") ); - - return EFalse; - } - } - else - { - OsTracePrint( KInfoLevel, (TUint8*) - ("UMAC: WlanDot11State::InitNetworkConnect: E802Dot11ExtendedRatesIE not present") ); - - // check if we meet mandatory rates; in this case extended supported rates - // don't need to be checked - if ( !AreSupportedRatesMet( aCtxImpl, EFalse ) ) - { - OsTracePrint( KWarningLevel, - (TUint8*)("UMAC: WlanDot11State::InitNetworkConnect: rates not met -> abort") ); - - return EFalse; - } - } - - // mandatory network rates are met -> proceed - + //============================================= // determine the channel of the network //============================================= @@ -3393,7 +3338,7 @@ OsTracePrint( KWarningLevel, (TUint8*) ("UMAC: WlanDot11State::InitNetworkConnect: 802Dot11DsParameterSetIE not found -> abort") ); - return EFalse; + return KWlanErrUnsupportedNwConf; } //============================================= @@ -3412,7 +3357,7 @@ OsTracePrint( KWarningLevel, (TUint8*)("UMAC: WlanDot11State::InitNetworkConnect: zero beacon interval -> abort") ); - return EFalse; + return KWlanErrUnsupportedNwConf; } //============================================= @@ -3522,7 +3467,7 @@ OsTracePrint( KWarningLevel, (TUint8*) ("UMAC: WlanDot11State::InitNetworkConnect: Nw's 802.11n requirements not met -> abort") ); - return EFalse; + return KWlanErrUnsupportedNwConf; } } else @@ -3573,11 +3518,72 @@ } //============================================= + // do we meet mandatory network rates + //============================================= + + // locate supported rates IE + if ( elementLocator.InformationElement( + E802Dot11SupportedRatesIE, + elementDatalength, + &elementData ) == WlanElementLocator::EWlanLocateOk ) + { + // ...and store it to our context + aCtxImpl.GetApSupportedRatesIE().SetIeData( + elementData, + elementDatalength ); + } + else + { + OsTracePrint( KWarningLevel, (TUint8*) + ("UMAC: WlanDot11State::InitNetworkConnect: supported rates IE not found -> abort") ); + + return KWlanErrUnsupportedNwConf; + } + + // locate extended supported rates information element + if ( elementLocator.InformationElement( + E802Dot11ExtendedRatesIE, + elementDatalength, + &elementData ) == WlanElementLocator::EWlanLocateOk ) + { + OsTracePrint( KInfoLevel, (TUint8*) + ("UMAC: WlanDot11State::InitNetworkConnect: E802Dot11ExtendedRatesIE present") ); + + // ...and store it to our context + aCtxImpl.GetApExtendedSupportedRatesIE().SetIeData( elementData, elementDatalength ); + + // check if we meet mandatory rates; in this case check also extended + // supported rates + if ( !AreSupportedRatesMet( aCtxImpl, ETrue ) ) + { + OsTracePrint( KWarningLevel, (TUint8*) + ("UMAC: WlanDot11State::InitNetworkConnect: rates not met -> abort") ); + + return KWlanErrUnsupportedNwConf; + } + } + else + { + OsTracePrint( KInfoLevel, (TUint8*) + ("UMAC: WlanDot11State::InitNetworkConnect: E802Dot11ExtendedRatesIE not present") ); + + // check if we meet mandatory rates; in this case extended supported + // rates don't need to be checked + if ( !AreSupportedRatesMet( aCtxImpl, EFalse ) ) + { + OsTracePrint( KWarningLevel, + (TUint8*)("UMAC: WlanDot11State::InitNetworkConnect: rates not met -> abort") ); + + return KWlanErrUnsupportedNwConf; + } + } + + //============================================= // determine U-APSD usage for the ACs/Tx queues //============================================= DetermineAcUapsdUsage( aCtxImpl ); - return ETrue; + return KErrNone; } // ----------------------------------------------------------------------------- @@ -4921,7 +4927,8 @@ aCtxImpl.HtSupportedByNw( ETrue ); OsTracePrint( KInfoLevel, (TUint8*) - ("UMAC: WlanDot11State::HandleHtCapabilities: HT capabilities element present => HT supported by nw") ); + ("UMAC: WlanDot11State::HandleHtCapabilities: HT capabilities " + "element present") ); } else { @@ -4929,7 +4936,8 @@ aCtxImpl.HtSupportedByNw( EFalse ); OsTracePrint( KInfoLevel, (TUint8*) - ("UMAC: WlanDot11State::HandleHtCapabilities: HT capabilities element not found") ); + ("UMAC: WlanDot11State::HandleHtCapabilities: HT capabilities " + "element not found => HT not supported") ); } return status; @@ -4959,16 +4967,22 @@ elementDatalength ); OsTracePrint( KInfoLevel, (TUint8*) - ("UMAC: WlanDot11State::HandleHtOperation: element present") ); + ("UMAC: WlanDot11State::HandleHtOperation: element present. " + "HT supported") ); } else { - // not found even though HT capabilities element is present => - // protocol error - status = EFalse; + // not found even though HT capabilities element is present. That's a + // protocol error. The only way we can try to cope with that is to + // handle the target nw as a non-HT nw + aCtxImpl.HtSupportedByNw( EFalse ); + // in this case we need to remove HT also from our BSS membership + // feature list + aCtxImpl.RemoveBssMembershipFeature( E802Dot11HtPhy ); OsTracePrint( KInfoLevel, (TUint8*) - ("UMAC: WlanDot11State::HandleHtOperation: element not found => protocol error") ); + ("UMAC: WlanDot11State::HandleHtOperation: element not found; " + "protocol error => HT disabled ") ); } return status; @@ -4998,6 +5012,9 @@ // nw supported it. We achieve that by handling the target nw as // a non-HT nw aCtxImpl.HtSupportedByNw( EFalse ); + // in this case we need to remove HT also from our BSS membership + // feature list + aCtxImpl.RemoveBssMembershipFeature( E802Dot11HtPhy ); OsTracePrint( KInfoLevel, (TUint8*) ("UMAC: WlanDot11State::HandleDot11n: TKIP as pairwise cipher " diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11Synchronize.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11Synchronize.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacDot11Synchronize.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 29 % +* %version: 31 % */ #include "config.h" @@ -65,7 +65,7 @@ // ----------------------------------------------------------------------------- // WlanDot11Synchronize::WlanDot11Synchronize() : - iState( EINIT ), iJoinFailed ( EFalse ) + iState( EINIT ), iJoinStatus ( KErrNone ) { } @@ -188,7 +188,7 @@ switch ( iState ) { case EINIT: - if ( InitActions( aCtxImpl ) ) + if ( ( iJoinStatus = InitActions( aCtxImpl ) ) == KErrNone ) { // we meet the requirements of the network so we can continue @@ -214,13 +214,12 @@ else { // network requirements not met. Take the same action as - // as in the join failed case + // in the join failed case OsTracePrint( KWarningLevel, (TUint8*) ("UMAC: WlanDot11Synchronize::OnStateEntryEvent(): network requirements not met - abort")); - iJoinFailed = ETrue; ChangeInternalState( aCtxImpl, ECONTINUEDOT11TRAVERSE ); } break; @@ -408,11 +407,11 @@ KUmacDetails, (TUint8*)("UMAC: WlanDot11Synchronize::ContinueDot11StateTraversal()")); - if ( iJoinFailed ) + if ( iJoinStatus != KErrNone ) { // set the completion code value to be returned to user mode // as the dot11idle state does the OID completion in this case - aCtxImpl.iStates.iIdleState.Set( KErrGeneral ); + aCtxImpl.iStates.iIdleState.Set( iJoinStatus ); // ... and proceed to dot11idle state ChangeState( aCtxImpl, *this, // prev state @@ -468,7 +467,7 @@ // // ----------------------------------------------------------------------------- // -TBool WlanDot11Synchronize::InitActions( WlanContextImpl& aCtxImpl ) +TInt WlanDot11Synchronize::InitActions( WlanContextImpl& aCtxImpl ) const { OsTracePrint( KUmacDetails, @@ -477,7 +476,6 @@ // as we are about to join a new AP, reset BSS Loss indicators aCtxImpl.ResetBssLossIndications(); - iJoinFailed = EFalse; // reset counter for this new AP connection aCtxImpl.ResetFailedTxPacketCount(); @@ -497,6 +495,9 @@ // Light PS is the initial desired PS mode configuration aCtxImpl.SetDesiredPsModeConfig( aCtxImpl.ClientLightPsModeConfig() ); + // also make sure that the dynamic power mode managemen parameters are in + // their WLAN Mgmt Client provided values + aCtxImpl.RestorePwrModeMgmtParameters(); // check do we meet the requirements for the network // and construct necessary objects for doing the connection @@ -504,7 +505,7 @@ return InitNetworkConnect( aCtxImpl, aCtxImpl.ScanResponseFrameBodyLength(), - aCtxImpl.ScanResponseFrameBody() ); + aCtxImpl.ScanResponseFrameBody() ); } // ----------------------------------------------------------------------------- @@ -984,7 +985,7 @@ // make a note of the failure and act // accordingly when we // soon again enter this state - iJoinFailed = ETrue; + iJoinStatus = KErrGeneral; } else { diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacWsaConfigure.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacWsaConfigure.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/UmacWsaConfigure.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 23 % +* %version: 24 % */ #include "config.h" @@ -171,14 +171,7 @@ ("UMAC: WlanWsaConfigure::Entry: iMcsFeedback: %d"), aCtxImpl.WHASettings().iHtCapabilities.iMcsFeedback ); } -#endif - - if ( aCtxImpl.WHASettings().iCapability & WHA::SSettings::KHtOperation ) - { - // wlanpdd indicates HT support. Record that in our BSS Membership - // features - aCtxImpl.AddBssMembershipFeature( E802Dot11HtPhy ); - } +#endif } // ----------------------------------------------------------------------------- diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/src/umacactivemodepowermodemgr.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacactivemodepowermodemgr.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacactivemodepowermodemgr.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 13 % +* %version: 14 % */ #include "config.h" @@ -24,11 +24,6 @@ #include "UmacContextImpl.h" -// Default Rx/Tx frame count threshold for considering change to Light PS mode. -// This value is used if another value hasn't been provided -const TUint KDefaultToLightPsFrameThreshold = 1; - - // ================= MEMBER FUNCTIONS ======================= // --------------------------------------------------------------------------- @@ -57,6 +52,7 @@ WlanContextImpl& /*aCtxImpl*/, WHA::TQueueId /*aQueueId*/, TUint16 aEtherType, + T802Dot11FrameControlTypeMask aDot11FrameType, TBool aIgnoreThisFrame ) { if ( aEtherType == KEapolType || @@ -69,7 +65,7 @@ } else { - if ( aIgnoreThisFrame ) + if ( aIgnoreThisFrame || aDot11FrameType == E802Dot11FrameTypeDataNull ) { // for these frames we don't increment the Tx counter diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdeeppsmodepowermodemgr.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdeeppsmodepowermodemgr.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdeeppsmodepowermodemgr.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 3 % +* %version: 4 % */ #include "config.h" @@ -42,32 +42,53 @@ { } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void WlanDeepPsModePowerModeMgr::SetParameters( + TUint16 aUapsdRxFrameLengthThreshold ) + { + iUapsdRxFrameLengthThreshold = aUapsdRxFrameLengthThreshold; + } + // --------------------------------------------------------------------------- // // --------------------------------------------------------------------------- // TPowerMgmtModeChange WlanDeepPsModePowerModeMgr::OnFrameTx( - WlanContextImpl& /*aCtxImpl*/, + WlanContextImpl& aCtxImpl, WHA::TQueueId /*aQueueId*/, TUint16 aEtherType, - TBool /*aIgnoreThisFrame*/ ) + T802Dot11FrameControlTypeMask aDot11FrameType, + TBool aIgnoreThisFrame ) { TPowerMgmtModeChange powerMgmtModeChange( ENoChange ); if ( aEtherType == KEapolType || - aEtherType == KWaiType ) + aEtherType == KWaiType || + aDot11FrameType == E802Dot11FrameTypeDataNull || + ( aEtherType == KArpType && + !(aCtxImpl.UapsdUsedForVoice() && aCtxImpl.InVoiceCallState()) ) ) { powerMgmtModeChange = EToActive; OsTracePrint( KPwrStateTransition, (TUint8*) - ("UMAC: WlanDeepPsModePowerModeMgr::OnFrameTx: EAPOL or WAI frame; change to Active") ); + ("UMAC: WlanDeepPsModePowerModeMgr::OnFrameTx: EAPOL, WAI or keep " + "alive frame or ARP in non- U-APSD WoWLAN call state; change to " + "Active") ); } - else + else if ( !aIgnoreThisFrame ) { powerMgmtModeChange = EToLightPs; OsTracePrint( KPwrStateTransition, (TUint8*) - ("UMAC: WlanDeepPsModePowerModeMgr::OnFrameTx: change to Light PS") ); + ("UMAC: WlanDeepPsModePowerModeMgr::OnFrameTx: change to Light" + " PS") ); + } + else + { + // no action needed } return powerMgmtModeChange; @@ -78,11 +99,11 @@ // --------------------------------------------------------------------------- // TPowerMgmtModeChange WlanDeepPsModePowerModeMgr::OnFrameRx( - WlanContextImpl& /*aCtxImpl*/, - WHA::TQueueId /*aAccessCategory*/, + WlanContextImpl& aCtxImpl, + WHA::TQueueId aAccessCategory, TUint16 aEtherType, - TBool /*aIgnoreThisFrame*/, - TUint /*aPayloadLength*/, + TBool aIgnoreThisFrame, + TUint aPayloadLength, TDaType aDaType ) { TPowerMgmtModeChange powerMgmtModeChange( ENoChange ); @@ -93,22 +114,36 @@ powerMgmtModeChange = EToActive; OsTracePrint( KPwrStateTransition, (TUint8*) - ("UMAC: WlanDeepPsModePowerModeMgr::OnFrameRx: EAPOL or WAI frame; change to Active") ); - } - else if ( aDaType == EBroadcastAddress ) - { - // no action needed - - OsTracePrint( KPwrStateTransition, (TUint8*) - ("UMAC: WlanDeepPsModePowerModeMgr::OnFrameRx: bcast frame; no state change") ); + ("UMAC: WlanDeepPsModePowerModeMgr::OnFrameRx: EAPOL or WAI frame;" + " change to Active") ); } else { - powerMgmtModeChange = EToLightPs; + if ( CountThisFrame( + aCtxImpl, + aAccessCategory, + aEtherType, + aIgnoreThisFrame, + aPayloadLength, + iUapsdRxFrameLengthThreshold, + aDaType ) ) + { + powerMgmtModeChange = EToLightPs; - OsTracePrint( KPwrStateTransition, (TUint8*) - ("UMAC: WlanDeepPsModePowerModeMgr::OnFrameRx: change to Light PS") ); + OsTracePrint( KPwrStateTransition, (TUint8*) + ("UMAC: WlanDeepPsModePowerModeMgr::OnFrameRx: change to Light" + " PS") ); + } } - return powerMgmtModeChange; + return powerMgmtModeChange; } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TPowerMgmtModeChange WlanDeepPsModePowerModeMgr::OnPsModeErrorIndication() + { + return EToActive; + } diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdot11ibssnormalmode.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdot11ibssnormalmode.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdot11ibssnormalmode.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 14 % +* %version: 15 % */ #include "config.h" @@ -110,13 +110,14 @@ aCtxImpl.IeData( aIeData ); aCtxImpl.IeDataLength( aIeDataLength ); + TInt status(KErrNone); // check do we meet the requirements for the network // and construct necessary objects for establishing the connection - if ( InitNetworkConnect( + if ( ( status = InitNetworkConnect( aCtxImpl, aScanResponseFrameBodyLength, - aScanResponseFrameBody ) ) + aScanResponseFrameBody ) ) == KErrNone ) { // continue @@ -134,7 +135,7 @@ { // abort ret = EFalse; - OnOidComplete( aCtxImpl, KErrGeneral ); + OnOidComplete( aCtxImpl, status ); } return ret; diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdot11infrastructurenormalmode.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdot11infrastructurenormalmode.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdot11infrastructurenormalmode.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 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" @@ -17,7 +17,7 @@ */ /* -* %version: 14 % +* %version: 15 % */ #include "config.h" @@ -56,6 +56,28 @@ // // --------------------------------------------------------------------------- // +void WlanDot11InfrastructureNormalMode::DoPsModeErrorIndication( + WlanContextImpl& aCtxImpl ) + { + OsTracePrint( KWlmIndication, (TUint8*) + ("UMAC: WlanDot11InfrastructureMode::DoPsModeErrorIndication") ); + + // as the lower layers indicate that there is a problem with the PS + // operation of the current AP, we want to be in CAM mode for as long + // as there's data activity. So, check if we need a mode change to be + // in CAM now + const TPowerMgmtModeChange KPowerMgmtModeChange ( + aCtxImpl.OnPsModeErrorIndication() ); + + // if any change is needed regarding our power mgmt mode, + // proceed with it + PowerMgmtModeChange( aCtxImpl, KPowerMgmtModeChange ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// TBool WlanDot11InfrastructureNormalMode::OnActiveToLightPsTimerTimeout( WlanContextImpl& aCtxImpl ) { diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdynamicpowermodemgmtcntx.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdynamicpowermodemgmtcntx.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacdynamicpowermodemgmtcntx.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 14 % +* %version: 15 % */ #include "config.h" @@ -55,6 +55,11 @@ iActiveCntx( NULL ), iWlanContextImpl( aWlanCtxImpl ) { + iActiveParamsBackup.iToLightPsTimeout = KDefaultToLightPsTimeout; + iActiveParamsBackup.iToLightPsFrameThreshold = + WlanActiveModePowerModeMgr::KDefaultToLightPsFrameThreshold; + iActiveParamsBackup.iUapsdRxFrameLengthThreshold = + WlanPowerModeMgrBase::KDefaultUapsdRxFrameLengthThreshold; os_memset( iIgnoreTraffic, 0, sizeof( iIgnoreTraffic ) ); } @@ -158,7 +163,8 @@ // TPowerMgmtModeChange WlanDynamicPowerModeMgmtCntx::OnFrameTx( WHA::TQueueId aQueueId, - TUint16 aEtherType ) + TUint16 aEtherType, + T802Dot11FrameControlTypeMask aDot11FrameType ) { TPowerMgmtModeChange powerMgmtModeChange( ENoChange ); @@ -172,13 +178,23 @@ iWlanContextImpl, aQueueId, aEtherType, + aDot11FrameType, iIgnoreTraffic[aQueueId] ); if ( powerMgmtModeChange != ENoChange ) { + iStateChange = ETrue; + // as we will do a mode change, cancel any possibly running // power mode management timers CancelTimeouts(); + + if ( aDot11FrameType == E802Dot11FrameTypeDataNull || + aEtherType == KArpType ) + { + // modify temporarily the Active mode parameters + SetKeepAliveActiveModeParameters(); + } } } else @@ -230,6 +246,8 @@ if ( powerMgmtModeChange != ENoChange ) { + iStateChange = ETrue; + // as we will do a mode change, cancel any possibly running // power mode management timers CancelTimeouts(); @@ -260,6 +278,57 @@ // // --------------------------------------------------------------------------- // +TPowerMgmtModeChange WlanDynamicPowerModeMgmtCntx::OnPsModeErrorIndication() + { + TPowerMgmtModeChange powerMgmtModeChange( ENoChange ); + + if ( iActiveCntx ) + { + // we have an active context, i.e. we are doing power mode mgmt + + if ( !iStateChange ) + { + powerMgmtModeChange = iActiveCntx->OnPsModeErrorIndication(); + + if ( powerMgmtModeChange != ENoChange ) + { + iStateChange = ETrue; + + // as we will do a mode change, cancel any possibly running + // power mode management timers + CancelTimeouts(); + + // modify temporarily the Active mode parameters + SetPsModeErrorActiveModeParameters(); + } + } + else + { + // state change already signalled from this power mode context, + // don't do it more than once. No action needed + OsTracePrint( KPwrStateTransition, (TUint8*) + ("UMAC: WlanDynamicPowerModeMgmtCntx::OnPsModeErrorIndication: " + "statechange already signalled") ); + } + } + else + { + // dynamic power mode mgmt is not active => "No change" will be + // returned. No action needed + } + + OsTracePrint( KPwrStateTransition, (TUint8*) + ("UMAC: WlanDynamicPowerModeMgmtCntx::OnPsModeErrorIndication: " + "statechange: %d"), + powerMgmtModeChange ); + + return powerMgmtModeChange; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// TBool WlanDynamicPowerModeMgmtCntx::OnActiveToLightPsTimerTimeout() { if ( ( iActiveCntx == &iActiveModeCntx ) && @@ -274,6 +343,11 @@ ("UMAC: WlanDynamicPowerModeMgmtCntx::OnActiveToLightPsTimerTimeout: change state: %d"), iStateChange ); + // make sure that the WLAN Mgmt Client provided Active mode + // parameter values are again used the next time by default + // + RestoreActiveModeParameters(); + if ( !iStateChange ) { RegisterToLightPsTimeout(); @@ -292,6 +366,11 @@ // In all these cases the timeout is not relevant and we take no action OsTracePrint( KPwrStateTransition, (TUint8*) ("UMAC: WlanDynamicPowerModeMgmtCntx::OnActiveToLightPsTimerTimeout: not relevant timeout") ); + + // however, make sure that the WLAN Mgmt Client provided Active mode + // parameter values are again used the next time by default + // + RestoreActiveModeParameters(); } return iStateChange; @@ -406,6 +485,15 @@ aToActiveFrameThreshold, aToDeepPsFrameThreshold, aUapsdRxFrameLengthThreshold ); + + iDeepPsModeCntx.SetParameters( aUapsdRxFrameLengthThreshold ); + + // take also a backup of the Active mode parameters + // + iActiveParamsBackup.iToLightPsTimeout = aToLightPsTimeout; + iActiveParamsBackup.iToLightPsFrameThreshold = aToLightPsFrameThreshold; + iActiveParamsBackup.iUapsdRxFrameLengthThreshold = + aUapsdRxFrameLengthThreshold; } // --------------------------------------------------------------------------- diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/src/umaclightpsmodepowermodemgr.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/umaclightpsmodepowermodemgr.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/umaclightpsmodepowermodemgr.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 3 % +* %version: 4 % */ #include "config.h" @@ -59,49 +59,54 @@ // --------------------------------------------------------------------------- // TPowerMgmtModeChange WlanLightPsModePowerModeMgr::OnFrameTx( - WlanContextImpl& /*aCtxImpl*/, + WlanContextImpl& aCtxImpl, WHA::TQueueId /*aQueueId*/, TUint16 aEtherType, + T802Dot11FrameControlTypeMask aDot11FrameType, TBool aIgnoreThisFrame ) { TPowerMgmtModeChange powerMgmtModeChange( ENoChange ); if ( aEtherType == KEapolType || - aEtherType == KWaiType ) + aEtherType == KWaiType || + aDot11FrameType == E802Dot11FrameTypeDataNull || + ( aEtherType == KArpType && + !(aCtxImpl.UapsdUsedForVoice() && aCtxImpl.InVoiceCallState())) ) { powerMgmtModeChange = EToActive; OsTracePrint( KPwrStateTransition, (TUint8*) - ("UMAC: WlanLightPsModePowerModeMgr::OnFrameTx: EAPOL or WAI frame; change to Active") ); + ("UMAC: WlanLightPsModePowerModeMgr::OnFrameTx: EAPOL, WAI or keep " + "alive frame or ARP in non- U-APSD WoWLAN call state; change to " + "Active") ); + } + else if ( !aIgnoreThisFrame ) + { + OsTracePrint( KPwrStateTransition, (TUint8*) + ("UMAC: WlanLightPsModePowerModeMgr::OnFrameTx: count this frame") ); + + ++iToActiveFrameCount; + ++iToDeepPsFrameCount; + + if ( iToActiveFrameCount >= iToActiveFrameThreshold ) + { + powerMgmtModeChange = EToActive; + + OsTracePrint( KPwrStateTransition, (TUint8*) + ("UMAC: WlanLightPsModePowerModeMgr::OnFrameTx: threshold " + "exceeded; change to Active") ); + } } else { - if ( !aIgnoreThisFrame ) - { - OsTracePrint( KPwrStateTransition, (TUint8*) - ("UMAC: WlanLightPsModePowerModeMgr::OnFrameTx: count this frame") ); - - ++iToActiveFrameCount; - ++iToDeepPsFrameCount; - - if ( iToActiveFrameCount >= iToActiveFrameThreshold ) - { - powerMgmtModeChange = EToActive; - - OsTracePrint( KPwrStateTransition, (TUint8*) - ("UMAC: WlanLightPsModePowerModeMgr::OnFrameTx: threshold exceeded; change to Active") ); - } - } - else - { - OsTracePrint( KPwrStateTransition, (TUint8*) - ("UMAC: WlanLightPsModePowerModeMgr::OnFrameTx: do no count this frame") ); - - // no further action needed - } + OsTracePrint( KPwrStateTransition, (TUint8*) + ("UMAC: WlanLightPsModePowerModeMgr::OnFrameTx: do not count " + "this frame") ); + + // no action needed } - return powerMgmtModeChange; + return powerMgmtModeChange; } // --------------------------------------------------------------------------- @@ -157,6 +162,15 @@ // // --------------------------------------------------------------------------- // +TPowerMgmtModeChange WlanLightPsModePowerModeMgr::OnPsModeErrorIndication() + { + return EToActive; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// TBool WlanLightPsModePowerModeMgr::OnLightPsToActiveTimerTimeout( WlanContextImpl& aCtxImpl ) { diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/src/umacnullsendcontroller.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacnullsendcontroller.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacnullsendcontroller.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007-2010 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" @@ -16,7 +16,7 @@ */ /* -* %version: 15 % +* %version: 16 % */ #include "config.h" @@ -397,32 +397,17 @@ iFlags &= ~KKeepAliveTimerArmed; - TUint32 KTimeAfterLatestTx ( - static_cast(os_systemTime() - iLatestTx) ); - - if ( KTimeAfterLatestTx >= iKeepAliveTimeout ) + // request a regular Null Data frame to be sent + // however, if there is a frame Tx (of any frame) already pending OR + // we use U-APSD for Voice and we are on a VoWLAN call + // we won't request a new frame to be sent. + if ( !iWlanContextImpl.UnsentTxPackets() && + !( iWlanContextImpl.UapsdUsedForVoice() && InVoiceCallState() ) ) { - // request a regular Null Data frame to be sent - - // however, if there is a frame Tx (of any frame) already pending, - // we won't request a new frame to be sent. - if ( !iWlanContextImpl.UnsentTxPackets() ) + if ( !iNullSender.TxNullDataFrame( iWlanContextImpl, EFalse ) ) { - if ( !iNullSender.TxNullDataFrame( iWlanContextImpl, EFalse ) ) - { - // frame was not sent because we didn't get a Tx buffer. - // In this case we'll skip the sending - // However, we need to re-arm the timer to trigger the next - // Null Data frame sending - RegisterKeepAliveTimeout( iKeepAliveTimeout ); - } - } - else - { - // frame Tx already pending, so we don't ask a Null Data to be sent - OsTracePrint( KUmacDetails, (TUint8*) - ("UMAC: WlanNullSendController::OnKeepAliveTimerTimeout: frame Tx already pending. New Null Data Tx request skipped") ); - + // frame was not sent because we didn't get a Tx buffer. + // In this case we'll skip the sending // However, we need to re-arm the timer to trigger the next // Null Data frame sending RegisterKeepAliveTimeout( iKeepAliveTimeout ); @@ -430,9 +415,15 @@ } else { - // No need to send keep alive; yet. Re-arm the timer with - // a suitable timeout relative to the time of the latest frame Tx - RegisterKeepAliveTimeout( iKeepAliveTimeout - KTimeAfterLatestTx ); + // we don't ask a Null Data to be sent + OsTracePrint( KUmacDetails, (TUint8*) + ("UMAC: WlanNullSendController::OnKeepAliveTimerTimeout: frame Tx " + "already pending OR U-APSD used for Voice and we are in VoWLAN" + "call => Null Data Tx request skipped") ); + + // However, we need to re-arm the timer to trigger the next + // Null Data frame sending + RegisterKeepAliveTimeout( iKeepAliveTimeout ); } } diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_common/umac_common/src/umacpowermodemgrbase.cpp --- a/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacpowermodemgrbase.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacpowermodemgrbase.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 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" @@ -16,16 +16,13 @@ */ /* -* %version: 8 % +* %version: 9 % */ #include "config.h" #include "umacpowermodemgrbase.h" #include "UmacContextImpl.h" -// Default frame payload length threshold value (in bytes) for U-APSD -const TUint32 KUapsdRxFrameLengthThreshold = 400; - // ================= MEMBER FUNCTIONS ======================= @@ -34,7 +31,7 @@ // --------------------------------------------------------------------------- // WlanPowerModeMgrBase::WlanPowerModeMgrBase() : - iUapsdRxFrameLengthThreshold( KUapsdRxFrameLengthThreshold ) + iUapsdRxFrameLengthThreshold( KDefaultUapsdRxFrameLengthThreshold ) { } @@ -50,6 +47,15 @@ // // --------------------------------------------------------------------------- // +TPowerMgmtModeChange WlanPowerModeMgrBase::OnPsModeErrorIndication() + { + return ENoChange; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// TBool WlanPowerModeMgrBase::OnActiveToLightPsTimerTimeout() { return EFalse; diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/RWlanLogicalChannel.h --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/RWlanLogicalChannel.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/RWlanLogicalChannel.h Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 18 % +* %version: 18.1.1 % */ #ifndef RWLAN_LOGICAL_CHANNEL_H_ @@ -201,11 +201,6 @@ private: // data /** - * has the WLAN system been initialized - */ - TBool iWlanSystemInitialized; - - /** * If a WLAN Management Command is executed asynchronously, this data * member is used to store the Management Command message - thus keeping * it valid until the asynchronous request is actually scheduled. diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/RWlanLogicalChannel.inl --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/RWlanLogicalChannel.inl Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/inc/RWlanLogicalChannel.inl Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 17 % +* %version: 17.1.1 % */ // ----------------------------------------------------------------------------- @@ -39,9 +39,7 @@ TWlanUnit aUnit, TOpenParam& aOpenParam ) { - iWlanSystemInitialized = EFalse; - - TInt err = DoCreate( + TInt err = DoCreate( LDD_NAME, VersionRequired(), aUnit, @@ -54,12 +52,6 @@ // driver load sequence success // do system init err = InitWlanSystem( aOpenParam ); - - if ( err == KErrNone ) - { - // WLAN system successfully initialized - iWlanSystemInitialized = ETrue; - } } return err; @@ -71,21 +63,12 @@ // inline void RWlanLogicalChannel::CloseChannel() { - // release WLAN system resources only if we have been able to do the - // initialization successfully. - // This check is done to prevent a release attempt in a case where the - // device driver framework has not been properly initialized to be able to - // handle requests - if ( iWlanSystemInitialized ) - { - TRequestStatus status; - DoRequest( EWlanFinitSystem, status ); - User::WaitForRequest(status); - - // not initialized any more. This is needed to handle the case - // that this method is called multiple times - iWlanSystemInitialized = EFalse; - } + // request WLAN system resources to be released + // + TRequestStatus status; + DoRequest( EWlanFinitSystem, status ); + User::WaitForRequest(status); + // internally call close Close(); } diff -r af3fb27c7511 -r 13838cf40350 wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/WlanLogicalChannel.cpp --- a/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/WlanLogicalChannel.cpp Tue May 25 14:40:09 2010 +0300 +++ b/wlan_bearer/wlanldd/wlan_symbian/wlanldd_symbian/src/WlanLogicalChannel.cpp Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 59 % +* %version: 59.1.1 % */ #include "WlLddWlanLddConfig.h" @@ -633,7 +633,6 @@ #else iOsa->MutexAcquire(); #endif - NKern::ThreadLeaveCS(); TraceDump(MUTEX, (("WLANLDD: DWlanLogicalChannel::DoControlFast: mutex acquired"))); @@ -705,14 +704,12 @@ } // release mutex - // Enter critical section before releasing the mutex as - // we are executing in the context of a user mode thread - NKern::ThreadEnterCS(); #ifndef RD_WLAN_DDK Kern::MutexSignal( iMutex ); #else iOsa->MutexRelease(); #endif + // and exit from critical section NKern::ThreadLeaveCS(); TraceDump(MUTEX, diff -r af3fb27c7511 -r 13838cf40350 wlan_plat/wlan_management_api/inc/wlanmgmtcommon.h --- a/wlan_plat/wlan_management_api/inc/wlanmgmtcommon.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_plat/wlan_management_api/inc/wlanmgmtcommon.h Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 10 % +* %version: 10.1.1 % */ #ifndef WLANMGMTCOMMON_H @@ -277,6 +277,22 @@ TWlanWpaPresharedKey iWpaPreSharedKey; }; +/** + * Data structure for storing IAP availability data. + */ +struct TWlanIapAvailabilityData + { + /** + * ID of the IAP. + */ + TUint iIapId; + /** + * Received Signal Strength Indicator (RSSI) of the strongest + * AP in the network. + */ + TUint iRssi; + }; + // CLASS DECLARATION /** * Callback interface for WLAN management notifications. diff -r af3fb27c7511 -r 13838cf40350 wlan_plat/wlan_management_api/inc/wlanmgmtinterface.h --- a/wlan_plat/wlan_management_api/inc/wlanmgmtinterface.h Tue May 25 14:40:09 2010 +0300 +++ b/wlan_plat/wlan_management_api/inc/wlanmgmtinterface.h Mon Jun 21 17:43:00 2010 +0300 @@ -16,7 +16,7 @@ */ /* -* %version: 16 % +* %version: 16.1.1 % */ #ifndef WLANMGMTINTERFACE_H @@ -410,6 +410,36 @@ */ virtual TInt StartAggressiveBgScan( TUint aInterval ) = 0; + + /** + * Get the available WLAN IAPs. + * + * @param aCacheLifetime Defines how many seconds old cached results the client + * is willing to accept. The valid is range is from 0 to + * 60 seconds. The value of -1 means the system default will + * be used. The aCacheLifetime parameter has a meaning only + * when the aMaxDelay parameter is zero. + * Value will be changed to the actual value used by the + * system. + * @param aMaxDelay Maximum amount of seconds the client is willing to wait for + * the availability results. The valid range is from 0 to 1200 + * seconds or KWlanInfiniteScanDelay. KWlanInfiniteScanDelay + * will never cause a scan, but the request will be + * completed when any other broadcast scan request is completed. + * Value will be changed to the actual value used by the system. + * @param aFilteredResults Whether availability is filtered based on signal strength. + ETrue if filtering is allowed, EFalse if not. + * @param aStatus Status of the calling active object. On successful + * completion contains KErrNone, otherwise one of the + * system-wide error codes. + * @param aAvailableIaps Array of IAPs available. + */ + virtual void GetAvailableIaps( + TInt& aCacheLifetime, + TUint& aMaxDelay, + TBool aFilteredResults, + TRequestStatus& aStatus, + RArray& aAvailableIaps ) = 0; }; #endif // WLANMGMTINTERFACE_H