diff options
| author | Akash Patel <akashp@codeaurora.org> | 2014-04-10 04:03:07 -0700 |
|---|---|---|
| committer | Akash Patel <akashp@codeaurora.org> | 2014-04-10 04:05:26 -0700 |
| commit | db92983ba759f5f19ccaf2ec63ccd6d2f30a07e6 (patch) | |
| tree | b1ffbfd0534252dd9a985508076ed80a60cd7c73 | |
| parent | acf08c6980a1b847047a8014cdf3f4e0bf1cad5f (diff) | |
| parent | 35dd6505a8269c23273d93f248df0b164f8bfba1 (diff) | |
Release 1.0.0.88 QCACLD WLAN Driver
Merge remote-tracking branch 'origin/caf/caf-wlan/master'
* origin/caf/caf-wlan/master:
Cafstaging Release 1.0.0.88
wlan: Fix for unregistering IPv4 notifier rightly.
Register IPv4 notifier to notify change in IP.
wlan: qcacld: Complete PMF (802.11w) support for Soft AP
wlan: MAC Address length fix
qcacld-new:Fix unencrypted bcast packets issue w/ soft mac used
wlan: add 11ac supported data rates
wlan: delete the list node before freeing skb
qcacld: Add timeout in while loop of hif_pci_targ_is_awake
wlan: Allow sched scan start request only in dis-connected state
wlan: VOS ASSERT during random connection test
wlan: Print Self MAC
wlan: qcacld: Fix for setting channel bond as zero for 802.11a
wlan: Fix for Static analysis issues in vos_nvitem.c
Change-Id: I074370fe7a2bb134d1c2945854667dd2203cb0d9
39 files changed, 1085 insertions, 161 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_hostapd.h b/CORE/HDD/inc/wlan_hdd_hostapd.h index 3b084a365ce9..3d957a8ccacc 100644 --- a/CORE/HDD/inc/wlan_hdd_hostapd.h +++ b/CORE/HDD/inc/wlan_hdd_hostapd.h @@ -83,6 +83,8 @@ int hdd_softap_unpackIE( tHalHandle halHandle, eCsrEncryptionType *pEncryptType, eCsrEncryptionType *mcEncryptType, eCsrAuthType *pAuthType, + v_BOOL_t *pMFPCapable, + v_BOOL_t *pMFPRequired, u_int16_t gen_ie_len, u_int8_t *gen_ie ); diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h index f9b30b77a706..b9f08e4856d2 100644 --- a/CORE/HDD/inc/wlan_hdd_main.h +++ b/CORE/HDD/inc/wlan_hdd_main.h @@ -894,6 +894,11 @@ struct hdd_adapter_s /** Handle to the network device */ struct net_device *dev; + /** IPv4 notifier callback for handling ARP offload on change in IP */ + struct notifier_block ipv4_notifier; + bool ipv4_notifier_registered; + struct work_struct ipv4NotifierWorkQueue; + //TODO Move this to sta Ctx struct wireless_dev wdev ; struct cfg80211_scan_request *request ; @@ -1453,6 +1458,7 @@ void hdd_reset_pwrparams(hdd_context_t *pHddCtx); int wlan_hdd_validate_context(hdd_context_t *pHddCtx); v_BOOL_t hdd_is_valid_mac_address(const tANI_U8* pMacAddr); VOS_STATUS hdd_issta_p2p_clientconnected(hdd_context_t *pHddCtx); +void hdd_ipv4_notifier_work_queue(struct work_struct *work); #ifdef WLAN_FEATURE_PACKET_FILTERING int wlan_hdd_setIPv6Filter(hdd_context_t *pHddCtx, tANI_U8 filterType, tANI_U8 sessionId); #endif diff --git a/CORE/HDD/inc/wlan_hdd_power.h b/CORE/HDD/inc/wlan_hdd_power.h index 49ddc729b2aa..2cb1f3f48bde 100644 --- a/CORE/HDD/inc/wlan_hdd_power.h +++ b/CORE/HDD/inc/wlan_hdd_power.h @@ -89,7 +89,7 @@ VOS_STATUS hdd_wlan_re_init(void *hif_sc); void hdd_conf_mcastbcast_filter(hdd_context_t* pHddCtx, v_BOOL_t setfilter); -VOS_STATUS hdd_conf_arp_offload(hdd_adapter_t* pAdapter, v_BOOL_t fenable); +VOS_STATUS hdd_conf_arp_offload(hdd_adapter_t* pAdapter, int fenable); /* * Function: hdd_conf_hostoffload * Central function to configure the supported offloads, diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c index 434caeab5693..18064d8399a1 100644 --- a/CORE/HDD/src/wlan_hdd_assoc.c +++ b/CORE/HDD/src/wlan_hdd_assoc.c @@ -657,7 +657,8 @@ static void hdd_SendAssociationEvent(struct net_device *dev,tCsrRoamInfo *pCsrRo } } #endif - pr_info("wlan: connected to " MAC_ADDRESS_STR"\n", + pr_info("wlan: " MAC_ADDRESS_STR " connected to " MAC_ADDRESS_STR "\n", + MAC_ADDR_ARRAY(pAdapter->macAddressCurrent.bytes), MAC_ADDR_ARRAY(wrqu.ap_addr.sa_data)); hdd_SendUpdateBeaconIEsEvent(pAdapter, pCsrRoamInfo); diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c index f8ac56591d83..ae8676bd3e33 100644 --- a/CORE/HDD/src/wlan_hdd_cfg80211.c +++ b/CORE/HDD/src/wlan_hdd_cfg80211.c @@ -1180,13 +1180,6 @@ void wlan_hdd_cfg80211_post_voss_start(hdd_adapter_t* pAdapter) sme_RegisterMgmtFrame(hHal, HDD_SESSION_ID_ANY, type, (v_U8_t*)WNM_BSS_ACTION_FRAME, WNM_BSS_ACTION_FRAME_SIZE ); - -#ifdef WLAN_FEATURE_11W - /* SA Query Response Action Frame */ - sme_RegisterMgmtFrame(hHal, HDD_SESSION_ID_ANY, type, - (v_U8_t*)SA_QUERY_FRAME_RSP, - SA_QUERY_FRAME_RSP_SIZE ); -#endif /* WLAN_FEATURE_11W */ } void wlan_hdd_cfg80211_pre_voss_stop(hdd_adapter_t* pAdapter) @@ -2093,6 +2086,8 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter, hdd_config_t *iniConfig; hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pHostapdAdapter); tSmeConfigParams *psmeConfig; + v_BOOL_t MFPCapable; + v_BOOL_t MFPRequired; ENTER(); @@ -2241,6 +2236,8 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter, &RSNEncryptType, &mcRSNEncryptType, &RSNAuthType, + &MFPCapable, + &MFPRequired, pConfig->pRSNWPAReqIE[1]+2, pConfig->pRSNWPAReqIE ); @@ -2280,6 +2277,8 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter, &RSNEncryptType, &mcRSNEncryptType, &RSNAuthType, + &MFPCapable, + &MFPRequired, pConfig->pRSNWPAReqIE[1]+2, pConfig->pRSNWPAReqIE ); @@ -2466,6 +2465,13 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter, pConfig->obssProtEnabled = (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->apOBSSProtEnabled; +#ifdef WLAN_FEATURE_11W + pConfig->mfpCapable = MFPCapable; + pConfig->mfpRequired = MFPRequired; + hddLog(LOG1, FL("Soft AP MFP capable %d, MFP required %d\n"), + pConfig->mfpCapable, pConfig->mfpRequired); +#endif + hddLog(LOGW, FL("SOftAP macaddress : "MAC_ADDRESS_STR), MAC_ADDR_ARRAY(pHostapdAdapter->macAddressCurrent.bytes)); hddLog(LOGW,FL("ssid =%s, beaconint=%d, channel=%d"), @@ -5738,7 +5744,6 @@ int wlan_hdd_cfg80211_connect_start( hdd_adapter_t *pAdapter, hdd_wext_state_t *pWextState; v_U32_t roamId; tCsrRoamProfile *pRoamProfile; - eMib_dot11DesiredBssType connectedBssType; eCsrAuthType RSNAuthType; ENTER(); @@ -5755,41 +5760,8 @@ int wlan_hdd_cfg80211_connect_start( hdd_adapter_t *pAdapter, if (pRoamProfile) { - int ret = 0; hdd_station_ctx_t *pHddStaCtx; pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter); - hdd_connGetConnectedBssType(pHddStaCtx,&connectedBssType ); - - if((eMib_dot11DesiredBssType_independent == connectedBssType) || - (eConnectionState_Associated == pHddStaCtx->conn_info.connState) || - (eConnectionState_IbssConnected == pHddStaCtx->conn_info.connState)) - { - /* Issue disconnect to CSR */ - INIT_COMPLETION(pAdapter->disconnect_comp_var); - if( eHAL_STATUS_SUCCESS == - sme_RoamDisconnect( WLAN_HDD_GET_HAL_CTX(pAdapter), - pAdapter->sessionId, - eCSR_DISCONNECT_REASON_UNSPECIFIED ) ) - { - ret = wait_for_completion_interruptible_timeout( - &pAdapter->disconnect_comp_var, - msecs_to_jiffies(WLAN_WAIT_TIME_DISCONNECT)); - if (0 == ret) - { - VOS_ASSERT(0); - } - } - } - else if(eConnectionState_Disconnecting == pHddStaCtx->conn_info.connState) - { - ret = wait_for_completion_interruptible_timeout( - &pAdapter->disconnect_comp_var, - msecs_to_jiffies(WLAN_WAIT_TIME_DISCONNECT)); - if (0 == ret) - { - VOS_ASSERT(0); - } - } if (HDD_WMM_USER_MODE_NO_QOS == (WLAN_HDD_GET_CTX(pAdapter))->cfg_ini->WmmMode) @@ -6665,6 +6637,57 @@ int wlan_hdd_cfg80211_set_privacy( hdd_adapter_t *pAdapter, } /* + * FUNCTION: wlan_hdd_try_disconnect + * This function is used to disconnect from previous + * connection + */ +static int wlan_hdd_try_disconnect( hdd_adapter_t *pAdapter ) +{ + long ret = 0; + hdd_station_ctx_t *pHddStaCtx; + eMib_dot11DesiredBssType connectedBssType; + + pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter); + + hdd_connGetConnectedBssType(pHddStaCtx,&connectedBssType ); + + if((eMib_dot11DesiredBssType_independent == connectedBssType) || + (eConnectionState_Associated == pHddStaCtx->conn_info.connState) || + (eConnectionState_IbssConnected == pHddStaCtx->conn_info.connState)) + { + /* Issue disconnect to CSR */ + INIT_COMPLETION(pAdapter->disconnect_comp_var); + if( eHAL_STATUS_SUCCESS == + sme_RoamDisconnect( WLAN_HDD_GET_HAL_CTX(pAdapter), + pAdapter->sessionId, + eCSR_DISCONNECT_REASON_UNSPECIFIED ) ) + { + ret = wait_for_completion_interruptible_timeout( + &pAdapter->disconnect_comp_var, + msecs_to_jiffies(WLAN_WAIT_TIME_DISCONNECT)); + if (0 >= ret) + { + hddLog(LOGE, FL("Failed to receive disconnect event")); + return -EALREADY; + } + } + } + else if(eConnectionState_Disconnecting == pHddStaCtx->conn_info.connState) + { + ret = wait_for_completion_interruptible_timeout( + &pAdapter->disconnect_comp_var, + msecs_to_jiffies(WLAN_WAIT_TIME_DISCONNECT)); + if (0 >= ret) + { + hddLog(LOGE, FL("Failed to receive disconnect event")); + return -EALREADY; + } + } + + return 0; +} + +/* * FUNCTION: wlan_hdd_cfg80211_set_privacy * This function is used to initialize the security * parameters during connect operation. @@ -6716,6 +6739,25 @@ static int wlan_hdd_cfg80211_connect( struct wiphy *wiphy, return -ECONNREFUSED; } #endif + + //If Device Mode is Station Concurrent Sessions Exit BMps + //P2P Mode will be taken care in Open/close adapter + if (!pHddCtx->cfg_ini->enablePowersaveOffload && + (WLAN_HDD_INFRA_STATION == pAdapter->device_mode) && + (vos_concurrent_sessions_running())) + { + exitbmpsStatus = hdd_disable_bmps_imps(pHddCtx, WLAN_HDD_INFRA_STATION); + } + + /*Try disconnecting if already in connected state*/ + status = wlan_hdd_try_disconnect(pAdapter); + if ( 0 > status) + { + hddLog(VOS_TRACE_LEVEL_ERROR, FL("Failed to disconnect the existing" + " connection")); + return -EALREADY; + } + /*initialise security parameters*/ status = wlan_hdd_cfg80211_set_privacy(pAdapter, req); @@ -6726,15 +6768,6 @@ static int wlan_hdd_cfg80211_connect( struct wiphy *wiphy, return status; } - //If Device Mode is Station Concurrent Sessions Exit BMps - //P2P Mode will be taken care in Open/close adapter - if(!pHddCtx->cfg_ini->enablePowersaveOffload && - (WLAN_HDD_INFRA_STATION == pAdapter->device_mode) && - (vos_concurrent_sessions_running())) - { - exitbmpsStatus = hdd_disable_bmps_imps(pHddCtx, WLAN_HDD_INFRA_STATION); - } - if ( req->channel ) { status = wlan_hdd_cfg80211_connect_start(pAdapter, req->ssid, @@ -7075,6 +7108,15 @@ static int wlan_hdd_cfg80211_join_ibss( struct wiphy *wiphy, return -EIO; } + /*Try disconnecting if already in connected state*/ + status = wlan_hdd_try_disconnect(pAdapter); + if ( 0 > status) + { + hddLog(VOS_TRACE_LEVEL_ERROR, FL("Failed to disconnect the existing" + " IBSS connection")); + return -EALREADY; + } + pRoamProfile = &pWextState->roamProfile; if ( eCSR_BSS_TYPE_START_IBSS != pRoamProfile->BSSType ) @@ -8620,6 +8662,7 @@ static eHalStatus wlan_hdd_is_pno_allowed(hdd_adapter_t *pAdapter) { hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL; hdd_adapter_t *pTempAdapter = NULL; + hdd_station_ctx_t *pStaCtx; hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter); int status = 0; @@ -8633,17 +8676,16 @@ static eHalStatus wlan_hdd_is_pno_allowed(hdd_adapter_t *pAdapter) while ((NULL != pAdapterNode) && (VOS_STATUS_SUCCESS == status)) { pTempAdapter = pAdapterNode->pAdapter; + pStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pTempAdapter); - if (pTempAdapter != pAdapter) + if (((WLAN_HDD_INFRA_STATION == pTempAdapter->device_mode) + && (eConnectionState_NotConnected != pStaCtx->conn_info.connState)) + || (WLAN_HDD_P2P_CLIENT == pTempAdapter->device_mode) + || (WLAN_HDD_P2P_GO == pTempAdapter->device_mode) + || (WLAN_HDD_SOFTAP == pTempAdapter->device_mode) + ) { - if (((WLAN_HDD_INFRA_STATION == pTempAdapter->device_mode) && - (eConnectionState_NotConnected != (WLAN_HDD_GET_STATION_CTX_PTR(pTempAdapter))->conn_info.connState)) || - (WLAN_HDD_P2P_CLIENT == pTempAdapter->device_mode) || - (WLAN_HDD_P2P_GO == pTempAdapter->device_mode) || - (WLAN_HDD_SOFTAP == pTempAdapter->device_mode)) - { - return eHAL_STATUS_FAILURE; - } + return eHAL_STATUS_FAILURE; } status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext ); pAdapterNode = pNext; diff --git a/CORE/HDD/src/wlan_hdd_early_suspend.c b/CORE/HDD/src/wlan_hdd_early_suspend.c index 8a97c3141cce..82252cda3337 100644 --- a/CORE/HDD/src/wlan_hdd_early_suspend.c +++ b/CORE/HDD/src/wlan_hdd_early_suspend.c @@ -711,17 +711,102 @@ void hdd_conf_ns_offload(hdd_adapter_t *pAdapter, v_BOOL_t fenable) return; } #endif -VOS_STATUS hdd_conf_arp_offload(hdd_adapter_t *pAdapter, v_BOOL_t fenable) + +void hdd_ipv4_notifier_work_queue(struct work_struct *work) +{ + hdd_adapter_t* pAdapter = + container_of(work, hdd_adapter_t, ipv4NotifierWorkQueue); + hdd_context_t *pHddCtx; + int status; + + hddLog(LOG1, FL("Reconfiguring ARP Offload")); + pHddCtx = WLAN_HDD_GET_CTX(pAdapter); + status = wlan_hdd_validate_context(pHddCtx); + if (0 != status) + { + hddLog(LOGE, FL("HDD context is invalid")); + return; + } + + if ((eConnectionState_Associated == + (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.connState) + && (VOS_TRUE == pHddCtx->sus_res_mcastbcast_filter_valid)) + { + // This invocation being part of the IPv4 registration callback, + // we are passing second parameter as 2 to avoid registration + // of IPv4 notifier again. + hdd_conf_arp_offload(pAdapter, 2); + } +} + +static int wlan_hdd_ipv4_changed(struct notifier_block *nb, + unsigned long data, void *arg) +{ + struct in_ifaddr *ifa = (struct in_ifaddr *)arg; + struct in_ifaddr **ifap = NULL; + struct in_device *in_dev; + + struct net_device *ndev = ifa->ifa_dev->dev; + hdd_adapter_t *pAdapter = + container_of(nb, struct hdd_adapter_s, ipv4_notifier); + hdd_context_t *pHddCtx; + int status; + if (pAdapter && pAdapter->dev == ndev) + { + pHddCtx = WLAN_HDD_GET_CTX(pAdapter); + status = wlan_hdd_validate_context(pHddCtx); + if (0 != status) + { + hddLog(LOGE, FL("HDD context is invalid")); + return NOTIFY_DONE; + } + if ((in_dev = __in_dev_get_rtnl(pAdapter->dev)) != NULL) + { + for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL; + ifap = &ifa->ifa_next) + { + if (!strcmp(pAdapter->dev->name, ifa->ifa_label)) + { + break; /* found */ + } + } + } + if(ifa && ifa->ifa_local) + { + schedule_work(&pAdapter->ipv4NotifierWorkQueue); + } + } + + return NOTIFY_DONE; +} + +/**---------------------------------------------------------------------------- + + \brief hdd_conf_arp_offload() - Configure ARP offload + + Called during SUSPEND to configure the ARP offload (MC BC filter) which + reduces power consumption. + + \param - pAdapter -Adapter context for which ARP offload is to be configured + \param - fenable - 0 - disable. + 1 - enable. (with IPv4 notifier registration) + 2 - enable. (without IPv4 notifier registration) + + \return - + VOS_STATUS_SUCCESS - on successful operation + VOS_STATUS_E_FAILURE - on failure of operation +-----------------------------------------------------------------------------*/ +VOS_STATUS hdd_conf_arp_offload(hdd_adapter_t *pAdapter, int fenable) { struct in_ifaddr **ifap = NULL; struct in_ifaddr *ifa = NULL; struct in_device *in_dev; int i = 0; + int ret = 0; tSirHostOffloadReq offLoadRequest; hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter); - hddLog(VOS_TRACE_LEVEL_INFO, "%s:", __func__); - + hddLog(VOS_TRACE_LEVEL_ERROR, FL(" fenable = %d \n"), fenable); if(fenable) { if ((in_dev = __in_dev_get_rtnl(pAdapter->dev)) != NULL) @@ -777,16 +862,39 @@ VOS_STATUS hdd_conf_arp_offload(hdd_adapter_t *pAdapter, v_BOOL_t fenable) "feature", __func__); return VOS_STATUS_E_FAILURE; } - return VOS_STATUS_SUCCESS; } else { - hddLog(VOS_TRACE_LEVEL_ERROR, "%s:IP Address is not assigned ", __func__); - return VOS_STATUS_E_AGAIN; + hddLog(VOS_TRACE_LEVEL_INFO, FL("IP Address is not assigned\n")); } + + if (fenable == 1 && !pAdapter->ipv4_notifier_registered) + { + // Register IPv4 notifier to notify if any change in IP + // So that we can reconfigure the offload parameters + pAdapter->ipv4_notifier.notifier_call = + wlan_hdd_ipv4_changed; + ret = register_inetaddr_notifier(&pAdapter->ipv4_notifier); + if (ret) + { + hddLog(LOGE, FL("Failed to register IPv4 notifier")); + } + else + { + hddLog(LOG1, FL("Registered IPv4 notifier")); + pAdapter->ipv4_notifier_registered = true; + } + } + return VOS_STATUS_SUCCESS; } else { + if (pAdapter->ipv4_notifier_registered) + { + hddLog(LOG1, FL("Unregistered IPv4 notifier")); + unregister_inetaddr_notifier(&pAdapter->ipv4_notifier); + pAdapter->ipv4_notifier_registered = false; + } vos_mem_zero((void *)&offLoadRequest, sizeof(tSirHostOffloadReq)); offLoadRequest.enableOrDisable = SIR_OFFLOAD_DISABLE; offLoadRequest.offloadType = SIR_IPV4_ARP_REPLY_OFFLOAD; diff --git a/CORE/HDD/src/wlan_hdd_ftm.c b/CORE/HDD/src/wlan_hdd_ftm.c index ec656e0e1492..16197939d448 100644 --- a/CORE/HDD/src/wlan_hdd_ftm.c +++ b/CORE/HDD/src/wlan_hdd_ftm.c @@ -221,7 +221,121 @@ static rateStr2rateIndex_t rateName_rateIndex_tbl[] = { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, "MCS_CB_90_MBPS"}, { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, "MCS_CB_120_MBPS"}, { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, "MCS_CB_135_MBPS"}, - { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, "MCS_CB_150_MBPS"} + { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, "MCS_CB_150_MBPS"}, + +#ifdef WLAN_FEATURE_11AC + /*11AC rate 20MHZ Normal GI*/ + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, "MCS_VHT20_NGI_6_5_MBPS"}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, "MCS_VHT20_NGI_13_MBPS"}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,"MCS_VHT20_NGI_19_5_MBPS"}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, "MCS_VHT20_NGI_26_MBPS"}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, "MCS_VHT20_NGI_39_MBPS"}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, "MCS_VHT20_NGI_52_MBPS"}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,"MCS_VHT20_NGI_58_5_MBPS"}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, "MCS_VHT20_NGI_65_MBPS"}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, "MCS_VHT20_NGI_78_MBPS"}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,"MCS_VHT20_NGI_86_5_MBPS"}, + + /*11AC rate 20MHZ Short GI*/ + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, "MCS_VHT20_SGI_7_2_MBPS"}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,"MCS_VHT20_SGI_14_4_MBPS"}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,"MCS_VHT20_SGI_21_6_MBPS"}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,"MCS_VHT20_SGI_28_8_MBPS"}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,"MCS_VHT20_SGI_43_3_MBPS"}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,"MCS_VHT20_SGI_57_7_MBPS"}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, "MCS_VHT20_SGI_65_MBPS"}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,"MCS_VHT20_SGI_72_2_MBPS"}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,"MCS_VHT20_SGI_86_6_MBPS"}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,"MCS_VHT20_SGI_96_1_MBPS"}, + + /*11AC rates 40MHZ normal GI*/ + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS, + "MCS_VHT40_NGI_CB_13_5_MBPS"}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS, + "MCS_VHT40_NGI_CB_27_MBPS"}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS, + "MCS_VHT40_NGI_CB_40_5_MBPS"}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS, + "MCS_VHT40_NGI_CB_54_MBPS"}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS, + "MCS_VHT40_NGI_CB_81_MBPS"}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS, + "MCS_VHT40_NGI_CB_108_MBPS"}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS, + "MCS_VHT40_NGI_CB_121_5_MBPS"}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS, + "MCS_VHT40_NGI_CB_135_MBPS"}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS, + "MCS_VHT40_NGI_CB_162_MBPS"}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS, + "MCS_VHT40_NGI_CB_180_MBPS"}, + + /*11AC rates 40MHZ short GI*/ + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS, + "MCS_VHT40_SGI_CB_15_MBPS"}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS, + "MCS_VHT40_SGI_CB_30_MBPS"}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS, + "MCS_VHT40_SGI_CB_45_MBPS"}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS, + "MCS_VHT40_SGI_CB_60_MBPS"}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS, + "MCS_VHT40_SGI_CB_90_MBPS"}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS, + "MCS_VHT40_SGI_CB_120_MBPS"}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS, + "MCS_VHT40_SGI_CB_135_MBPS"}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS, + "MCS_VHT40_SGI_CB_150_MBPS"}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS, + "MCS_VHT40_SGI_CB_180_MBPS"}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS, + "MCS_VHT40_SGI_CB_200_MBPS"}, + + /*11AC rates 80 MHZ normal GI*/ + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS, + "MCS_VHT80_NGI_CB_29_3_MBPS"}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS, + "MCS_VHT80_NGI_CB_58_5_MBPS"}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS, + "MCS_VHT80_NGI_CB_87_8_MBPS"}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS, + "MCS_VHT80_NGI_CB_117_MBPS"}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS, + "MCS_VHT80_NGI_CB_175_5_MBPS"}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS, + "MCS_VHT80_NGI_CB_234_MBPS"}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS, + "MCS_VHT80_NGI_CB_263_3_MBPS"}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS, + "MCS_VHT80_NGI_CB_292_5_MBPS"}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS, + "MCS_VHT80_NGI_CB_351_MBPS"}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS, + "MCS_VHT80_NGI_CB_390_MBPS"}, + + /*11AC rates 80 MHZ short GI*/ + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS, + "MCS_VHT80_SGI_CB_32_5_MBPS"}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS, + "MCS_VHT80_SGI_CB_65_MBPS"}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS, + "MCS_VHT80_SGI_CB_97_5_MBPS"}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS, + "MCS_VHT80_SGI_CB_130_MBPS"}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS, + "MCS_VHT80_SGI_CB_195_MBPS"}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS, + "MCS_VHT80_SGI_CB_260_MBPS"}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS, + "MCS_VHT80_SGI_CB_292_5_MBPS"}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS, + "MCS_VHT80_SGI_CB_325_MBPS"}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS, + "MCS_VHT80_SGI_CB_390_MBPS"}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS, + "MCS_VHT80_SGI_CB_433_3_MBPS"}, +#endif }; @@ -291,8 +405,81 @@ static rateIndex2Preamble_t rate_index_2_preamble_table[] = { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, PHYDBG_PREAMBLE_MIXED}, { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, PHYDBG_PREAMBLE_MIXED}, { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED}, - { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, PHYDBG_PREAMBLE_MIXED} - + { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, PHYDBG_PREAMBLE_MIXED}, + +#ifdef WLAN_FEATURE_11AC + /*11AC rate 20MHZ Normal GI*/ + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,PHYDBG_PREAMBLE_MIXED}, + + /*11AC rate 20MHZ Short GI*/ + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,PHYDBG_PREAMBLE_MIXED}, + + /*11AC rates 40MHZ normal GI*/ + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS, PHYDBG_PREAMBLE_MIXED}, + + /*11AC rates 40MHZ short GI*/ + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,PHYDBG_PREAMBLE_MIXED}, + + /*11AC rates 80 MHZ normal GI*/ + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS, PHYDBG_PREAMBLE_MIXED}, + + /*11AC rates 80 MHZ short GI*/ + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS, PHYDBG_PREAMBLE_MIXED}, + { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,PHYDBG_PREAMBLE_MIXED}, +#endif }; static unsigned int valid_channel[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c index 3ac48af720c4..217f962e8757 100644 --- a/CORE/HDD/src/wlan_hdd_hostapd.c +++ b/CORE/HDD/src/wlan_hdd_hostapd.c @@ -1190,11 +1190,14 @@ stopbss : } return VOS_STATUS_SUCCESS; } + int hdd_softap_unpackIE( tHalHandle halHandle, eCsrEncryptionType *pEncryptType, eCsrEncryptionType *mcEncryptType, eCsrAuthType *pAuthType, + v_BOOL_t *pMFPCapable, + v_BOOL_t *pMFPRequired, u_int16_t gen_ie_len, u_int8_t *gen_ie ) { @@ -1247,7 +1250,8 @@ int hdd_softap_unpackIE( //dot11RSNIE.gp_cipher_suite_count *mcEncryptType = hdd_TranslateRSNToCsrEncryptionType(dot11RSNIE.gp_cipher_suite); // Set the PMKSA ID Cache for this interface - + *pMFPCapable = 0 != (dot11RSNIE.RSN_Cap[0] & 0x80); + *pMFPRequired = 0 != (dot11RSNIE.RSN_Cap[0] & 0x40); // Calling csrRoamSetPMKIDCache to configure the PMKIDs into the cache } else if (gen_ie[0] == DOT11F_EID_WPA) @@ -1279,6 +1283,8 @@ int hdd_softap_unpackIE( *pEncryptType = hdd_TranslateWPAToCsrEncryptionType(dot11WPAIE.unicast_ciphers[0]); //dot11WPAIE.unicast_cipher_count *mcEncryptType = hdd_TranslateWPAToCsrEncryptionType(dot11WPAIE.multicast_cipher); + *pMFPCapable = VOS_FALSE; + *pMFPRequired = VOS_FALSE; } else { @@ -2522,6 +2528,8 @@ static iw_softap_commit(struct net_device *dev, eCsrAuthType RSNAuthType; eCsrEncryptionType RSNEncryptType; eCsrEncryptionType mcRSNEncryptType; + v_BOOL_t MFPCapable = VOS_FALSE; + v_BOOL_t MFPRequired = VOS_FALSE; pHostapdState = WLAN_HDD_GET_HOSTAP_STATE_PTR(pHostapdAdapter); pCommitConfig = (s_CommitConfig_t *)extra; @@ -2588,6 +2596,8 @@ static iw_softap_commit(struct net_device *dev, &RSNEncryptType, &mcRSNEncryptType, &RSNAuthType, + &MFPCapable, + &MFPRequired, pConfig->pRSNWPAReqIE[1]+2, pConfig->pRSNWPAReqIE ); @@ -3879,7 +3889,7 @@ int iw_get_softap_linkspeed(struct net_device *dev, unsigned short staId; int len = sizeof(v_U32_t)+1; v_BYTE_t macAddress[VOS_MAC_ADDR_SIZE]; - VOS_STATUS status; + VOS_STATUS status = VOS_STATUS_E_FAILURE; int rc, valid; pHddCtx = WLAN_HDD_GET_CTX(pHostapdAdapter); @@ -3892,37 +3902,37 @@ int iw_get_softap_linkspeed(struct net_device *dev, return valid; } - hddLog(VOS_TRACE_LEVEL_INFO, "%s wrqu->data.length= %d", __func__, wrqu->data.length); - if (wrqu->data.length != MAC_ADDRESS_STR_LEN) - { - hddLog(LOG1, "Invalid length"); - return -EINVAL; - } - pmacAddress = kmalloc(MAC_ADDRESS_STR_LEN, GFP_KERNEL); - if(NULL == pmacAddress) { - hddLog(LOG1, "unable to allocate memory"); - return -ENOMEM; - } - if (copy_from_user((void *)pmacAddress, - wrqu->data.pointer, wrqu->data.length)) + hddLog(VOS_TRACE_LEVEL_INFO, "%s wrqu->data.length= %d\n", __func__, wrqu->data.length); + + if (wrqu->data.length >= MAC_ADDRESS_STR_LEN - 1) { - hddLog(LOG1, "%s: failed to copy data to user buffer", __func__); - kfree(pmacAddress); - return -EFAULT; - } + pmacAddress = kmalloc(MAC_ADDRESS_STR_LEN, GFP_KERNEL); + if (NULL == pmacAddress) { + hddLog(LOG1, "unable to allocate memory"); + return -ENOMEM; + } + if (copy_from_user((void *)pmacAddress, + wrqu->data.pointer, MAC_ADDRESS_STR_LEN)) + { + hddLog(LOG1, "%s: failed to copy data to user buffer", __func__); + kfree(pmacAddress); + return -EFAULT; + } + pmacAddress[MAC_ADDRESS_STR_LEN] = '\0'; - status = hdd_string_to_hex (pmacAddress, wrqu->data.length, macAddress ); - kfree(pmacAddress); + status = hdd_string_to_hex (pmacAddress, MAC_ADDRESS_STR_LEN, macAddress ); + kfree(pmacAddress); - if (!VOS_IS_STATUS_SUCCESS(status )) - { - hddLog(VOS_TRACE_LEVEL_ERROR, FL("String to Hex conversion Failed")); + if (!VOS_IS_STATUS_SUCCESS(status )) + { + hddLog(VOS_TRACE_LEVEL_ERROR, FL("String to Hex conversion Failed")); + } } /* If no mac address is passed and/or its length is less than 17, * link speed for first connected client will be returned. */ - if (!VOS_IS_STATUS_SUCCESS(status ) || wrqu->data.length < 17) + if (wrqu->data.length < 17 || !VOS_IS_STATUS_SUCCESS(status )) { status = hdd_softap_GetConnectedStaId(pHostapdAdapter, (void *)(&staId)); } diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index 19df28e82eef..6ee97015557c 100644 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -83,6 +83,8 @@ #include <linux/wireless.h> #include <net/cfg80211.h> +#include <linux/inetdevice.h> +#include <net/addrconf.h> #include "wlan_hdd_cfg80211.h" #include "wlan_hdd_p2p.h" #include <linux/rtnetlink.h> @@ -7781,6 +7783,9 @@ hdd_adapter_t* hdd_open_adapter( hdd_context_t *pHddCtx, tANI_U8 session_type, hdd_deinit_adapter(pHddCtx, pAdapter); goto err_free_netdev; } + // Workqueue which gets scheduled in IPv4 notification callback. + INIT_WORK(&pAdapter->ipv4NotifierWorkQueue, hdd_ipv4_notifier_work_queue); + //Stop the Interface TX queue. netif_tx_disable(pAdapter->dev); //netif_tx_disable(pWlanDev); @@ -8191,6 +8196,16 @@ VOS_STATUS hdd_stop_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter ) } } } + + if (pAdapter->ipv4_notifier_registered) + { + hddLog(LOG1, FL("Unregistered IPv4 notifier")); + unregister_inetaddr_notifier(&pAdapter->ipv4_notifier); + pAdapter->ipv4_notifier_registered = false; + } +#ifdef WLAN_OPEN_SOURCE + cancel_work_sync(&pAdapter->ipv4NotifierWorkQueue); +#endif if (test_bit(SME_SESSION_OPENED, &pAdapter->event_flags)) { INIT_COMPLETION(pAdapter->session_close_comp_var); diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c index 4e565e0859bb..08e157362b5d 100644 --- a/CORE/HDD/src/wlan_hdd_tx_rx.c +++ b/CORE/HDD/src/wlan_hdd_tx_rx.c @@ -265,8 +265,9 @@ void hdd_flush_ibss_tx_queues( hdd_adapter_t *pAdapter, v_U8_t STAId) tmpNext = tmp->next; /* Data for STAId is freed along with the queue node */ - kfree_skb(skb); + list_del(tmp); + kfree_skb(skb); tmp = tmpNext; ++pAdapter->hdd_stats.hddTxRxStats.txFlushed; diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h index 67776107365d..0d00af129855 100644 --- a/CORE/MAC/inc/qwlan_version.h +++ b/CORE/MAC/inc/qwlan_version.h @@ -42,9 +42,9 @@ BRIEF DESCRIPTION: #define QWLAN_VERSION_MINOR 0 #define QWLAN_VERSION_PATCH 0 #define QWLAN_VERSION_EXTRA "" -#define QWLAN_VERSION_BUILD 87 +#define QWLAN_VERSION_BUILD 88 -#define QWLAN_VERSIONSTR "1.0.0.87" +#define QWLAN_VERSIONSTR "1.0.0.88" #ifdef QCA_WIFI_2_0 diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h index f0d1f79825a8..744e1ad9939a 100644 --- a/CORE/MAC/inc/sirApi.h +++ b/CORE/MAC/inc/sirApi.h @@ -662,6 +662,12 @@ typedef struct sSirSmeStartBssReq tSirMacRateSet operationalRateSet;// Has 11a or 11b rates tSirMacRateSet extendedRateSet; // Has 11g rates tSirHTConfig htConfig; + +#ifdef WLAN_FEATURE_11W + tANI_BOOLEAN pmfCapable; + tANI_BOOLEAN pmfRequired; +#endif + } tSirSmeStartBssReq, *tpSirSmeStartBssReq; #define GET_IE_LEN_IN_BSS(lenInBss) ( lenInBss + sizeof(lenInBss) - \ diff --git a/CORE/MAC/inc/sirMacProtDef.h b/CORE/MAC/inc/sirMacProtDef.h index 177bf1b64a90..6ef52af97d93 100644 --- a/CORE/MAC/inc/sirMacProtDef.h +++ b/CORE/MAC/inc/sirMacProtDef.h @@ -680,7 +680,9 @@ typedef enum eSirMacStatusCodes eSIR_MAC_SHORT_SLOT_NOT_SUPORTED_STATUS = 25, //Association denied due to requesting station not supporting the Short Slot Time //option eSIR_MAC_DSSS_OFDM_NOT_SUPPORTED_STATUS = 26, //Association denied due to requesting station not supporting the DSSS-OFDM option - // reserved 27-31 + // reserved 27-29 + eSIR_MAC_TRY_AGAIN_LATER = 30, //Association request rejected temporarily, try again later + // reserved 31 eSIR_MAC_QOS_UNSPECIFIED_FAILURE_STATUS = 32, //Unspecified, QoS-related failure eSIR_MAC_QAP_NO_BANDWIDTH_STATUS = 33, //Association denied because QoS AP has insufficient bandwidth to handle another //QoS STA @@ -2846,6 +2848,11 @@ typedef __ani_attr_pre_packed struct sSirPhy11aHdr #define SIR_MAC_MIN_IE_LEN 2 // Minimum IE length for IE validation + +#define SIR_MAC_TI_TYPE_REASSOC_DEADLINE 1 +#define SIR_MAC_TI_TYPE_KEY_LIFETIME 2 +#define SIR_MAC_TI_TYPE_ASSOC_COMEBACK 3 + #define SIR_MAC_VHT_CAP_MAX_MPDU_LEN 0 #define SIR_MAC_VHT_CAP_SUPP_CH_WIDTH_SET 2 #define SIR_MAC_VHT_CAP_LDPC_CODING_CAP 4 diff --git a/CORE/MAC/inc/wniCfgAp.h b/CORE/MAC/inc/wniCfgAp.h index e815cc0c7ed0..3db433b97cec 100644 --- a/CORE/MAC/inc/wniCfgAp.h +++ b/CORE/MAC/inc/wniCfgAp.h @@ -346,13 +346,15 @@ #define WNI_CFG_TDLS_BUF_STA_ENABLED 299 #define WNI_CFG_TDLS_PUAPSD_INACT_TIME 300 #define WNI_CFG_TDLS_RX_FRAME_THRESHOLD 301 -#define WNI_CFG_ENABLE_ADAPT_RX_DRAIN 302 -#define WNI_CFG_FLEX_CONNECT_POWER_FACTOR 303 -#define WNI_CFG_ANTENNA_DIVESITY 304 -#define WNI_CFG_GO_LINK_MONITOR_TIMEOUT 305 -#define WNI_CFG_RMC_ACTION_PERIOD_FREQUENCY 306 -#define WNI_CFG_CURRENT_RSSI 307 -#define WNI_CFG_RTT3_ENABLE 308 +#define WNI_CFG_PMF_SA_QUERY_MAX_RETRIES 302 +#define WNI_CFG_PMF_SA_QUERY_RETRY_INTERVAL 303 +#define WNI_CFG_ENABLE_ADAPT_RX_DRAIN 304 +#define WNI_CFG_FLEX_CONNECT_POWER_FACTOR 305 +#define WNI_CFG_ANTENNA_DIVESITY 306 +#define WNI_CFG_GO_LINK_MONITOR_TIMEOUT 307 +#define WNI_CFG_RMC_ACTION_PERIOD_FREQUENCY 308 +#define WNI_CFG_CURRENT_RSSI 309 +#define WNI_CFG_RTT3_ENABLE 310 /* * String parameter lengths @@ -2524,6 +2526,22 @@ #define WNI_CFG_TDLS_RX_FRAME_THRESHOLD_APMAX 20 #define WNI_CFG_TDLS_RX_FRAME_THRESHOLD_APDEF 10 +#define WNI_CFG_PMF_SA_QUERY_MAX_RETRIES_STAMIN 0 +#define WNI_CFG_PMF_SA_QUERY_MAX_RETRIES_STAMAX 20 +#define WNI_CFG_PMF_SA_QUERY_MAX_RETRIES_STADEF 5 + +#define WNI_CFG_PMF_SA_QUERY_MAX_RETRIES_APMIN 0 +#define WNI_CFG_PMF_SA_QUERY_MAX_RETRIES_APMAX 20 +#define WNI_CFG_PMF_SA_QUERY_MAX_RETRIES_APDEF 5 + +#define WNI_CFG_PMF_SA_QUERY_RETRY_INTERVAL_STAMIN 0 +#define WNI_CFG_PMF_SA_QUERY_RETRY_INTERVAL_STAMAX 2000 +#define WNI_CFG_PMF_SA_QUERY_RETRY_INTERVAL_STADEF 200 + +#define WNI_CFG_PMF_SA_QUERY_RETRY_INTERVAL_APMIN 0 +#define WNI_CFG_PMF_SA_QUERY_RETRY_INTERVAL_APMAX 2000 +#define WNI_CFG_PMF_SA_QUERY_RETRY_INTERVAL_APDEF 200 + #define WNI_CFG_ENABLE_ADAPT_RX_DRAIN_STAMIN 0 #define WNI_CFG_ENABLE_ADAPT_RX_DRAIN_STAMAX 1 #define WNI_CFG_ENABLE_ADAPT_RX_DRAIN_STADEF 1 @@ -2576,10 +2594,10 @@ #define WNI_CFG_RTT3_ENABLE_APMAX 1 #define WNI_CFG_RTT3_ENABLE_APDEF 1 -#define CFG_PARAM_MAX_NUM 309 -#define CFG_AP_IBUF_MAX_SIZE 248 +#define CFG_PARAM_MAX_NUM 311 +#define CFG_AP_IBUF_MAX_SIZE 250 #define CFG_AP_SBUF_MAX_SIZE 3422 -#define CFG_STA_IBUF_MAX_SIZE 243 +#define CFG_STA_IBUF_MAX_SIZE 245 #define CFG_STA_SBUF_MAX_SIZE 3388 #define CFG_SEM_MAX_NUM 19 diff --git a/CORE/MAC/inc/wniCfgSta.h b/CORE/MAC/inc/wniCfgSta.h index d0ec7121942c..e83788549c54 100644 --- a/CORE/MAC/inc/wniCfgSta.h +++ b/CORE/MAC/inc/wniCfgSta.h @@ -340,13 +340,15 @@ #define WNI_CFG_TDLS_BUF_STA_ENABLED 299 #define WNI_CFG_TDLS_PUAPSD_INACT_TIME 300 #define WNI_CFG_TDLS_RX_FRAME_THRESHOLD 301 -#define WNI_CFG_ENABLE_ADAPT_RX_DRAIN 302 -#define WNI_CFG_FLEX_CONNECT_POWER_FACTOR 303 -#define WNI_CFG_ANTENNA_DIVESITY 304 -#define WNI_CFG_GO_LINK_MONITOR_TIMEOUT 305 -#define WNI_CFG_RMC_ACTION_PERIOD_FREQUENCY 306 -#define WNI_CFG_CURRENT_RSSI 307 -#define WNI_CFG_RTT3_ENABLE 308 +#define WNI_CFG_PMF_SA_QUERY_MAX_RETRIES 302 +#define WNI_CFG_PMF_SA_QUERY_RETRY_INTERVAL 303 +#define WNI_CFG_ENABLE_ADAPT_RX_DRAIN 304 +#define WNI_CFG_FLEX_CONNECT_POWER_FACTOR 305 +#define WNI_CFG_ANTENNA_DIVESITY 306 +#define WNI_CFG_GO_LINK_MONITOR_TIMEOUT 307 +#define WNI_CFG_RMC_ACTION_PERIOD_FREQUENCY 308 +#define WNI_CFG_CURRENT_RSSI 309 +#define WNI_CFG_RTT3_ENABLE 310 /* * String parameter lengths @@ -1637,6 +1639,14 @@ #define WNI_CFG_TDLS_RX_FRAME_THRESHOLD_STAMAX 20 #define WNI_CFG_TDLS_RX_FRAME_THRESHOLD_STADEF 10 +#define WNI_CFG_PMF_SA_QUERY_MAX_RETRIES_STAMIN 0 +#define WNI_CFG_PMF_SA_QUERY_MAX_RETRIES_STAMAX 20 +#define WNI_CFG_PMF_SA_QUERY_MAX_RETRIES_STADEF 5 + +#define WNI_CFG_PMF_SA_QUERY_RETRY_INTERVAL_STAMIN 0 +#define WNI_CFG_PMF_SA_QUERY_RETRY_INTERVAL_STAMAX 2000 +#define WNI_CFG_PMF_SA_QUERY_RETRY_INTERVAL_STADEF 200 + #define WNI_CFG_ENABLE_ADAPT_RX_DRAIN_STAMIN 0 #define WNI_CFG_ENABLE_ADAPT_RX_DRAIN_STAMAX 1 #define WNI_CFG_ENABLE_ADAPT_RX_DRAIN_STADEF 1 @@ -1665,8 +1675,8 @@ #define WNI_CFG_RTT3_ENABLE_STAMAX 1 #define WNI_CFG_RTT3_ENABLE_STADEF 1 -#define CFG_PARAM_MAX_NUM 309 -#define CFG_STA_IBUF_MAX_SIZE 243 +#define CFG_PARAM_MAX_NUM 311 +#define CFG_STA_IBUF_MAX_SIZE 245 #define CFG_STA_SBUF_MAX_SIZE 3388 #define CFG_SEM_MAX_NUM 19 diff --git a/CORE/MAC/src/cfg/cfgParamName.c b/CORE/MAC/src/cfg/cfgParamName.c index 17990e184307..c35f7e266553 100644 --- a/CORE/MAC/src/cfg/cfgParamName.c +++ b/CORE/MAC/src/cfg/cfgParamName.c @@ -337,6 +337,8 @@ unsigned char *gCfgParamName[] = { (unsigned char *)"TDLS_BUF_STA_ENABLED", (unsigned char *)"TDLS_PUAPSD_INACT_TIME", (unsigned char *)"TDLS_RX_FRAME_THRESHOLD", + (unsigned char *)"PMF_SA_QUERY_MAX_RETRIES", + (unsigned char *)"PMF_SA_QUERY_RETRY_INTERVAL", (unsigned char *)"ENABLE_ADAPT_RX_DRAIN", (unsigned char *)"FLEX_CONNECT_POWER_FACTOR", (unsigned char *)"ANTENNA_DIVESITY", diff --git a/CORE/MAC/src/cfg/cfgUtil/cfg.txt b/CORE/MAC/src/cfg/cfgUtil/cfg.txt index f0e1521b95b3..49fe19986800 100644 --- a/CORE/MAC/src/cfg/cfgUtil/cfg.txt +++ b/CORE/MAC/src/cfg/cfgUtil/cfg.txt @@ -4541,6 +4541,32 @@ LIM V RW NP LIM 10 20 10 + +* +* PMF SA Query Maximum Retries +* + +WNI_CFG_PMF_SA_QUERY_MAX_RETRIES I 4 1 +V RO NP RESTART +NONE +0 20 5 +V RO NP RESTART +NONE +0 20 5 + +* +* PMF SA Query Retry Interval (in TUs) +* + +WNI_CFG_PMF_SA_QUERY_RETRY_INTERVAL I 4 1 +V RO NP RESTART +NONE +0 2000 200 +V RO NP RESTART +NONE +0 2000 200 + + * *MCC ENABLE/DISABLE ADAPTIVE RX Drain feature * diff --git a/CORE/MAC/src/include/dphGlobal.h b/CORE/MAC/src/include/dphGlobal.h index f7662c12ca1e..37fc1f3c8b8c 100644 --- a/CORE/MAC/src/include/dphGlobal.h +++ b/CORE/MAC/src/include/dphGlobal.h @@ -178,6 +178,17 @@ #define DPH_STA_HASH_INDEX_PEER 1 +#ifdef WLAN_FEATURE_11W +//DPH PMF SA Query state for station + +#define DPH_SA_QUERY_NOT_IN_PROGRESS 1 + +#define DPH_SA_QUERY_IN_PROGRESS 2 + +#define DPH_SA_QUERY_TIMED_OUT 3 +#endif + + typedef struct sDphRateBasedCtr { @@ -603,6 +614,14 @@ typedef struct sDphHashNode tANI_U8 vhtBeamFormerCapable; #endif +#ifdef WLAN_FEATURE_11W + tANI_U8 pmfSaQueryState; + tANI_U8 pmfSaQueryRetryCount; + tANI_U16 pmfSaQueryCurrentTransId; + tANI_U16 pmfSaQueryStartTransId; + TX_TIMER pmfSaQueryTimer; +#endif + tANI_U8 htLdpcCapable; tANI_U8 vhtLdpcCapable; diff --git a/CORE/MAC/src/include/parserApi.h b/CORE/MAC/src/include/parserApi.h index 2d87c4875959..14149588b6f1 100644 --- a/CORE/MAC/src/include/parserApi.h +++ b/CORE/MAC/src/include/parserApi.h @@ -889,3 +889,7 @@ PopulateDot11fWiderBWChanSwitchAnn(tpAniSirGlobal pMac, tDot11fIEWiderBWChanSwitchAnn *pDot11f, tpPESession psessionEntry); #endif + +void PopulateDot11fTimeoutInterval( tpAniSirGlobal pMac, + tDot11fIETimeoutInterval *pDot11f, + tANI_U8 type, tANI_U32 value ); diff --git a/CORE/MAC/src/pe/lim/limAssocUtils.c b/CORE/MAC/src/pe/lim/limAssocUtils.c index 3e7595aa444b..c7f230c2f85a 100644 --- a/CORE/MAC/src/pe/lim/limAssocUtils.c +++ b/CORE/MAC/src/pe/lim/limAssocUtils.c @@ -446,10 +446,10 @@ limCheckRxRSNIeMatch(tpAniSirGlobal pMac, tDot11fIERSN rxRSNIe,tpPESession pSess tDot11fIERSN *pRSNIe; tANI_U8 i, j, match, onlyNonHtCipher = 1; #ifdef WLAN_FEATURE_11W - tANI_BOOLEAN weRequirePMF; tANI_BOOLEAN weArePMFCapable; - tANI_BOOLEAN theyRequirePMF; + tANI_BOOLEAN weRequirePMF; tANI_BOOLEAN theyArePMFCapable; + tANI_BOOLEAN theyRequirePMF; #endif @@ -511,11 +511,12 @@ limCheckRxRSNIeMatch(tpAniSirGlobal pMac, tDot11fIERSN rxRSNIe,tpPESession pSess } *pmfConnection = eANI_BOOLEAN_FALSE; + #ifdef WLAN_FEATURE_11W - weRequirePMF = (pRSNIe->RSN_Cap[0] >> 6) & 0x1; - weArePMFCapable = (pRSNIe->RSN_Cap[0] >> 7) & 0x1; - theyRequirePMF = (rxRSNIe.RSN_Cap[0] >> 6) & 0x1; + weArePMFCapable = pSessionEntry->pLimStartBssReq->pmfCapable; + weRequirePMF = pSessionEntry->pLimStartBssReq->pmfRequired; theyArePMFCapable = (rxRSNIe.RSN_Cap[0] >> 7) & 0x1; + theyRequirePMF = (rxRSNIe.RSN_Cap[0] >> 6) & 0x1; if ((theyRequirePMF && theyArePMFCapable && !weArePMFCapable) || (weRequirePMF && !theyArePMFCapable)) @@ -530,6 +531,10 @@ limCheckRxRSNIeMatch(tpAniSirGlobal pMac, tDot11fIERSN rxRSNIe,tpPESession pSess if(theyArePMFCapable && weArePMFCapable) *pmfConnection = eANI_BOOLEAN_TRUE; + + limLog(pMac, LOG1, FL("weAreCapable %d, weRequire %d, theyAreCapable %d, " + "theyRequire %d, PMFconnection %d"), + weArePMFCapable, weRequirePMF, theyArePMFCapable, theyRequirePMF, *pmfConnection); #endif return eSIR_SUCCESS; @@ -3397,6 +3402,10 @@ limDeleteDphHashEntry(tpAniSirGlobal pMac, tSirMacAddr staAddr, tANI_U16 staId,t schSetFixedBeaconFields(pMac,psessionEntry); limSendBeaconParams(pMac, &beaconParams, psessionEntry ); } + +#ifdef WLAN_FEATURE_11W + tx_timer_delete(&pStaDs->pmfSaQueryTimer); +#endif } if (dphDeleteHashEntry(pMac, staAddr, staId, &psessionEntry->dph.dphHashTable) != eSIR_SUCCESS) limLog(pMac, LOGP, FL("error deleting hash entry")); diff --git a/CORE/MAC/src/pe/lim/limProcessActionFrame.c b/CORE/MAC/src/pe/lim/limProcessActionFrame.c index a6c5c3626a56..9437dd284b7e 100644 --- a/CORE/MAC/src/pe/lim/limProcessActionFrame.c +++ b/CORE/MAC/src/pe/lim/limProcessActionFrame.c @@ -2083,18 +2083,56 @@ static void __limProcessSAQueryResponseActionFrame(tpAniSirGlobal pMac, tANI_U8 { tpSirMacMgmtHdr pHdr; tANI_U32 frameLen; + tANI_U8 *pBody; + tpDphHashNode pSta; + tANI_U16 aid; + tANI_U16 transId; + tANI_U8 retryNum; pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo); frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo); + pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo); VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO, ("SA Query Response received...")) ; - /* Forward to the SME to HDD to wpa_supplicant */ - // type is ACTION - limSendSmeMgmtFrameInd(pMac, pHdr->fc.subType, - (tANI_U8*)pHdr, frameLen + sizeof(tSirMacMgmtHdr), 0, - WDA_GET_RX_CH( pRxPacketInfo ), psessionEntry, 0); -} + /* If this is an unprotected SA Query Response, then ignore it. */ + if (pHdr->fc.wep == 0) + return; + + pSta = dphLookupHashEntry(pMac, pHdr->sa, &aid, &psessionEntry->dph.dphHashTable); + if (NULL == pSta) + return; + + limLog(pMac, LOG1, + FL("SA Query Response source addr - %0x:%0x:%0x:%0x:%0x:%0x"), + pHdr->sa[0], pHdr->sa[1], pHdr->sa[2], pHdr->sa[3], + pHdr->sa[4], pHdr->sa[5]); + limLog(pMac, LOG1, + FL("SA Query state for station - %d"), pSta->pmfSaQueryState); + + if (DPH_SA_QUERY_IN_PROGRESS != pSta->pmfSaQueryState) + return; + + /* Extract 11w trsansId from SA query reponse action frame + In SA query response action frame: + Category : 1 byte + Action : 1 byte + Transaction ID : 2 bytes */ + vos_mem_copy(&transId, &pBody[2], 2); + + /* If SA Query is in progress with the station and the station + responds then the association request that triggered the SA + query is from a rogue station, just go back to initial state. */ + for (retryNum = 0; retryNum <= pSta->pmfSaQueryRetryCount; retryNum++) + if (transId == pSta->pmfSaQueryStartTransId + retryNum) + { + limLog(pMac, LOG1, + FL("Found matching SA Query Request - transaction ID %d"), transId); + tx_timer_deactivate(&pSta->pmfSaQueryTimer); + pSta->pmfSaQueryState = DPH_SA_QUERY_NOT_IN_PROGRESS; + break; + } +} #endif /** @@ -2418,7 +2456,7 @@ limProcessActionFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo,tpPESession ps break; case SIR_MAC_SA_QUERY_RSP: /**11w SA query response action frame received**/ - /* Forward to the SME to HDD to wpa_supplicant */ + /* Handle based on the current SA Query state */ __limProcessSAQueryResponseActionFrame(pMac,(tANI_U8*) pRxPacketInfo, psessionEntry ); break; default: diff --git a/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c b/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c index 9aa69ecd49e5..f8d95b28761f 100644 --- a/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c +++ b/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c @@ -54,6 +54,9 @@ #include "limAdmitControl.h" #include "palApi.h" #include "limSessionUtils.h" +#ifdef WLAN_FEATURE_11W +#include "wniCfgAp.h" +#endif #include "vos_types.h" @@ -191,6 +194,10 @@ limProcessAssocReqFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo, tSirMacRateSet basicRates; tANI_U8 i = 0, j = 0; tANI_BOOLEAN pmfConnection = eANI_BOOLEAN_FALSE; +#ifdef WLAN_FEATURE_11W + tPmfSaQueryTimerId timerId; + tANI_U32 retryInterval; +#endif limGetPhyMode(pMac, &phyMode, psessionEntry); @@ -858,9 +865,57 @@ limProcessAssocReqFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo, goto error; } // if (pStaDs->mlmStaContext.mlmState != eLIM_MLM_LINK_ESTABLISHED_STATE) - /* STA sent association Request frame while already in - * 'associated' state and no change in the capability - * so drop the frame */ + /* STA sent association Request frame while already in + * 'associated' state */ + +#ifdef WLAN_FEATURE_11W + limLog(pMac, LOG1, FL("Re/Assoc request from station that is already associated")); + limLog(pMac, LOG1, FL("PMF enabled %d, SA Query state %d"), pStaDs->rmfEnabled, + pStaDs->pmfSaQueryState); + if (pStaDs->rmfEnabled) + { + switch (pStaDs->pmfSaQueryState) + { + + // start SA Query procedure, respond to Association Request + // with try again later + case DPH_SA_QUERY_NOT_IN_PROGRESS: + limSendAssocRspMgmtFrame(pMac, eSIR_MAC_TRY_AGAIN_LATER, 1, + pHdr->sa, subType, pStaDs, psessionEntry); + limSendSaQueryRequestFrame( + pMac, (tANI_U8 *)&(pStaDs->pmfSaQueryCurrentTransId), + pHdr->sa, psessionEntry); + pStaDs->pmfSaQueryStartTransId = pStaDs->pmfSaQueryCurrentTransId; + pStaDs->pmfSaQueryCurrentTransId++; + pStaDs->pmfSaQueryRetryCount = 0; + + // start timer for SA Query retry + if (tx_timer_activate(&pStaDs->pmfSaQueryTimer) != TX_SUCCESS) + { + limLog(pMac, LOGE, FL("PMF SA Query timer activation failed!")); + goto error; + } + + pStaDs->pmfSaQueryState = DPH_SA_QUERY_IN_PROGRESS; + goto error; + + // SA Query procedure still going, respond to Association + // Request with try again later + case DPH_SA_QUERY_IN_PROGRESS: + limSendAssocRspMgmtFrame(pMac, eSIR_MAC_TRY_AGAIN_LATER, 1, + pHdr->sa, subType, 0, psessionEntry); + goto error; + + // SA Query procedure timed out, accept Association Request + // normally + case DPH_SA_QUERY_TIMED_OUT: + pStaDs->pmfSaQueryState = DPH_SA_QUERY_NOT_IN_PROGRESS; + break; + } + } +#endif + + /* no change in the capability so drop the frame */ if ((VOS_TRUE == vos_mem_compare(&pStaDs->mlmStaContext.capabilityInfo, &pAssocReq->capabilityInfo, sizeof(tSirMacCapabilityInfo)))&& @@ -1223,6 +1278,31 @@ if (limPopulateMatchingRateSet(pMac, #ifdef WLAN_FEATURE_11W pStaDs->rmfEnabled = (pmfConnection) ? 1 : 0; + pStaDs->pmfSaQueryState = DPH_SA_QUERY_NOT_IN_PROGRESS; + timerId.fields.sessionId = psessionEntry->peSessionId; + timerId.fields.peerIdx = peerIdx; + if (wlan_cfgGetInt(pMac, WNI_CFG_PMF_SA_QUERY_RETRY_INTERVAL, + &retryInterval) != eSIR_SUCCESS) + { + limLog(pMac, LOGE, FL("Could not retrieve PMF SA Query retry interval value")); + limRejectAssociation(pMac, pHdr->sa, + subType, true, authType, + peerIdx, false, + (tSirResultCodes) eSIR_MAC_UNSPEC_FAILURE_STATUS, psessionEntry); + goto error; + } + if (tx_timer_create(&pStaDs->pmfSaQueryTimer, "PMF SA Query timer", + limPmfSaQueryTimerHandler, timerId.value, + SYS_MS_TO_TICKS((retryInterval * 1024) / 1000), + 0, TX_NO_ACTIVATE) != TX_SUCCESS) + { + limLog(pMac, LOGE, FL("could not create PMF SA Query timer")); + limRejectAssociation(pMac, pHdr->sa, + subType, true, authType, + peerIdx, false, + (tSirResultCodes) eSIR_MAC_UNSPEC_FAILURE_STATUS, psessionEntry); + goto error; + } #endif if (pAssocReq->ExtCap.present) diff --git a/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c index 8458fd595f48..bd0bab65622e 100644 --- a/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c +++ b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c @@ -1707,6 +1707,10 @@ limMlmAddBss ( pAddBssParams->currentOperChannel = pMlmStartReq->channelNumber; pAddBssParams->currentExtChannel = pMlmStartReq->cbMode; +#ifdef WLAN_FEATURE_11W + pAddBssParams->rmfEnabled = psessionEntry->limRmfEnabled; +#endif + /* Update PE sessionId*/ pAddBssParams->sessionId = pMlmStartReq->sessionId; @@ -1743,11 +1747,6 @@ limMlmAddBss ( pAddBssParams->extSetStaKeyParamValid = 0; #endif -#ifdef WLAN_FEATURE_11W - pAddBssParams->rmfEnabled = (psessionEntry->gStartBssRSNIe.RSN_Cap[0] >> 7) & 0x1; - limLog( pMac, LOG1, FL("PMF capable value for BSS is %d"), pAddBssParams->rmfEnabled); -#endif - // // FIXME_GEN4 // A global counter (dialog token) is required to keep track of diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c index 9512b02c16c4..d506ec0eeb69 100644 --- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c +++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c @@ -641,6 +641,11 @@ __limHandleSmeStartBssRequest(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf) psessionEntry->txLdpcIniFeatureEnabled = pSmeStartBssReq->txLdpcIniFeatureEnabled; +#ifdef WLAN_FEATURE_11W + psessionEntry->limRmfEnabled = pSmeStartBssReq->pmfCapable ? 1 : 0; + limLog(pMac, LOG1, FL("Session RMF enabled: %d"), psessionEntry->limRmfEnabled); +#endif + vos_mem_copy((void*)&psessionEntry->rateSet, (void*)&pSmeStartBssReq->operationalRateSet, sizeof(tSirMacRateSet)); diff --git a/CORE/MAC/src/pe/lim/limSendManagementFrames.c b/CORE/MAC/src/pe/lim/limSendManagementFrames.c index d051ead7d43a..f29b07eba84f 100644 --- a/CORE/MAC/src/pe/lim/limSendManagementFrames.c +++ b/CORE/MAC/src/pe/lim/limSendManagementFrames.c @@ -50,15 +50,15 @@ #include "limSendMessages.h" #include "limAssocUtils.h" #include "limFT.h" +#ifdef WLAN_FEATURE_11W +#include "wniCfgAp.h" +#endif #if defined WLAN_FEATURE_VOWIFI #include "rrmApi.h" #endif #include "wlan_qct_wda.h" -#ifdef WLAN_FEATURE_11W -#include "dot11fdefs.h" -#endif //////////////////////////////////////////////////////////////////////// @@ -1462,6 +1462,11 @@ limSendAssocRspMgmtFrame(tpAniSirGlobal pMac, tANI_U16 addStripoffIELen = 0; tDot11fIEExtCap extractedExtCap; tANI_BOOLEAN extractedExtCapFlag = eANI_BOOLEAN_FALSE; +#ifdef WLAN_FEATURE_11W + tANI_U32 retryInterval; + tANI_U32 maxRetries; +#endif + if(NULL == psessionEntry) { limLog( pMac, LOGE, FL("psessionEntry is NULL")); @@ -1577,8 +1582,24 @@ limSendAssocRspMgmtFrame(tpAniSirGlobal pMac, } // End if on non-NULL 'pSta'. +#ifdef WLAN_FEATURE_11W + if( eSIR_MAC_TRY_AGAIN_LATER == statusCode ) + { + if ( wlan_cfgGetInt(pMac, WNI_CFG_PMF_SA_QUERY_MAX_RETRIES, + &maxRetries ) != eSIR_SUCCESS ) + limLog( pMac, LOGE, FL("Could not retrieve PMF SA Query maximum retries value") ); + else + if ( wlan_cfgGetInt(pMac, WNI_CFG_PMF_SA_QUERY_RETRY_INTERVAL, + &retryInterval ) != eSIR_SUCCESS) + limLog( pMac, LOGE, FL("Could not retrieve PMF SA Query timer interval value") ); + else + PopulateDot11fTimeoutInterval( + pMac, &frm.TimeoutInterval, SIR_MAC_TI_TYPE_ASSOC_COMEBACK, + (maxRetries - pSta->pmfSaQueryRetryCount) * retryInterval ); + } +#endif - vos_mem_set(( tANI_U8* )&beaconParams, sizeof( tUpdateBeaconParams), 0); + vos_mem_set(( tANI_U8* )&beaconParams, sizeof( tUpdateBeaconParams), 0); if( psessionEntry->limSystemRole == eLIM_AP_ROLE ){ if(psessionEntry->gLimProtectionControl != WNI_CFG_FORCE_POLICY_PROTECTION_DISABLE) @@ -6353,6 +6374,158 @@ returnAfterError: #ifdef WLAN_FEATURE_11W /** + * \brief Send SA query request action frame to peer + * + * \sa limSendSaQueryRequestFrame + * + * + * \param pMac The global tpAniSirGlobal object + * + * \param transId Transaction identifier + * + * \param peer The Mac address of the station to which this action frame is addressed + * + * \param psessionEntry The PE session entry + * + * \return eSIR_SUCCESS if setup completes successfully + * eSIR_FAILURE is some problem is encountered + */ + +tSirRetStatus limSendSaQueryRequestFrame( tpAniSirGlobal pMac, tANI_U8 *transId, + tSirMacAddr peer, tpPESession psessionEntry ) +{ + + tDot11fSaQueryReq frm; // SA query request action frame + tANI_U8 *pFrame; + tSirRetStatus nSirStatus; + tpSirMacMgmtHdr pMacHdr; + tANI_U32 nBytes, nPayload, nStatus; + void *pPacket; + eHalStatus halstatus; + tANI_U8 txFlag = 0; + tANI_U8 smeSessionId = 0; + + vos_mem_set( ( tANI_U8* )&frm, sizeof( frm ), 0 ); + frm.Category.category = SIR_MAC_ACTION_SA_QUERY; + /* 11w action field is : + action: 0 --> SA Query Request action frame + action: 1 --> SA Query Response action frame */ + frm.Action.action = SIR_MAC_SA_QUERY_REQ; + /* 11w SA Query Request transId */ + vos_mem_copy( &frm.TransactionId.transId[0], &transId[0], 2 ); + + nStatus = dot11fGetPackedSaQueryReqSize(pMac, &frm, &nPayload); + if ( DOT11F_FAILED( nStatus ) ) + { + limLog( pMac, LOGP, FL("Failed to calculate the packed size " + "for an SA Query Request (0x%08x)."), + nStatus ); + // We'll fall back on the worst case scenario: + nPayload = sizeof( tDot11fSaQueryReq ); + } + else if ( DOT11F_WARNED( nStatus ) ) + { + limLog( pMac, LOGW, FL("There were warnings while calculating " + "the packed size for an SA Query Request" + " (0x%08x)."), nStatus ); + } + + nBytes = nPayload + sizeof( tSirMacMgmtHdr ); + halstatus = palPktAlloc( pMac->hHdd, HAL_TXRX_FRM_802_11_MGMT, nBytes, ( void** ) &pFrame, ( void** ) &pPacket ); + if ( ! HAL_STATUS_SUCCESS ( halstatus ) ) + { + limLog( pMac, LOGP, FL("Failed to allocate %d bytes for a SA Query Request " + "action frame"), nBytes ); + return eSIR_FAILURE; + } + + // Paranoia: + vos_mem_set( pFrame, nBytes, 0 ); + + // Copy necessary info to BD + nSirStatus = limPopulateMacHeader( pMac, + pFrame, + SIR_MAC_MGMT_FRAME, + SIR_MAC_MGMT_ACTION, + peer, psessionEntry->selfMacAddr ); + if ( eSIR_SUCCESS != nSirStatus ) + goto returnAfterError; + + // Update A3 with the BSSID + pMacHdr = ( tpSirMacMgmtHdr ) pFrame; + + sirCopyMacAddr( pMacHdr->bssId, psessionEntry->bssId ); + + // Since this is a SA Query Request, set the "protect" (aka WEP) bit + // in the FC + limSetProtectedBit(pMac, psessionEntry, peer, pMacHdr); + + // Pack 11w SA Query Request frame + nStatus = dot11fPackSaQueryReq( pMac, + &frm, + pFrame + sizeof( tSirMacMgmtHdr ), + nPayload, + &nPayload ); + + if ( DOT11F_FAILED( nStatus )) + { + limLog( pMac, LOGE, + FL( "Failed to pack an SA Query Request (0x%08x)." ), + nStatus ); + // FIXME - Need to convert to tSirRetStatus + nSirStatus = eSIR_FAILURE; + goto returnAfterError; + } + else if ( DOT11F_WARNED( nStatus )) + { + limLog( pMac, LOGW, + FL( "There were warnings while packing SA Query Request (0x%08x)." ), + nStatus); + } + + limLog( pMac, LOG1, + FL( "Sending an SA Query Request to " )); + limPrintMacAddr( pMac, peer, LOG1 ); + limLog( pMac, LOG1, + FL( "Sending an SA Query Request from " )); + limPrintMacAddr( pMac, psessionEntry->selfMacAddr, LOG1 ); + + if ( ( SIR_BAND_5_GHZ == limGetRFBand( psessionEntry->currentOperChannel ) ) +#ifdef WLAN_FEATURE_P2P + || ( psessionEntry->pePersona == VOS_P2P_CLIENT_MODE ) || + ( psessionEntry->pePersona == VOS_P2P_GO_MODE ) +#endif + ) + { + txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME; + } + smeSessionId = psessionEntry->smeSessionId; + + halstatus = halTxFrame( pMac, + pPacket, + (tANI_U16) nBytes, + HAL_TXRX_FRM_802_11_MGMT, + ANI_TXDIR_TODS, + 7,//SMAC_SWBD_TX_TID_MGMT_HIGH, + limTxComplete, + pFrame, txFlag, smeSessionId); + if ( eHAL_STATUS_SUCCESS != halstatus ) + { + PELOGE(limLog( pMac, LOGE, FL( "halTxFrame FAILED! Status [%d]" ), halstatus );) + nSirStatus = eSIR_FAILURE; + //Pkt will be freed up by the callback + return nSirStatus; + } + else { + return eSIR_SUCCESS; + } + +returnAfterError: + palPktFree( pMac->hHdd, HAL_TXRX_FRM_802_11_MGMT, ( void* ) pFrame, ( void* ) pPacket ); + return nSirStatus; +} // End limSendSaQueryRequestFrame + +/** * \brief Send SA query response action frame to peer * * \sa limSendSaQueryResponseFrame @@ -6440,10 +6613,7 @@ tSirMacAddr peer,tpPESession psessionEntry) // Since this is a SA Query Response, set the "protect" (aka WEP) bit // in the FC - if ( psessionEntry->limRmfEnabled ) - { - pMacHdr->fc.wep = 1; - } + limSetProtectedBit(pMac, psessionEntry, peer, pMacHdr); // Pack 11w SA query response frame nStatus = dot11fPackSaQueryRsp( pMac, diff --git a/CORE/MAC/src/pe/lim/limSerDesUtils.c b/CORE/MAC/src/pe/lim/limSerDesUtils.c index e7e4c0b54e74..05cd4ab88aa4 100644 --- a/CORE/MAC/src/pe/lim/limSerDesUtils.c +++ b/CORE/MAC/src/pe/lim/limSerDesUtils.c @@ -665,6 +665,17 @@ limStartBssReqSerDes(tpAniSirGlobal pMac, tpSirSmeStartBssReq pStartBssReq, tANI if (limCheckRemainingLength(pMac, len) == eSIR_FAILURE) return eSIR_FAILURE; +#ifdef WLAN_FEATURE_11W + // Extract MFP capable/required + pStartBssReq->pmfCapable = *pBuf++; + len--; + if (limCheckRemainingLength(pMac, len) == eSIR_FAILURE) + return eSIR_FAILURE; + pStartBssReq->pmfRequired = *pBuf++; + len--; + if (limCheckRemainingLength(pMac, len) == eSIR_FAILURE) + return eSIR_FAILURE; +#endif // Extract rsnIe pStartBssReq->rsnIE.length = limGetU16(pBuf); diff --git a/CORE/MAC/src/pe/lim/limTypes.h b/CORE/MAC/src/pe/lim/limTypes.h index 30d9e90aa402..20419ece5474 100644 --- a/CORE/MAC/src/pe/lim/limTypes.h +++ b/CORE/MAC/src/pe/lim/limTypes.h @@ -862,7 +862,11 @@ void limProcessMlmHalBADeleteInd( tpAniSirGlobal pMac, void limProcessMlmRemoveKeyRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ ); void limProcessLearnIntervalTimeout(tpAniSirGlobal pMac); + #ifdef WLAN_FEATURE_11W +//11w send SA query request action frame +tSirRetStatus limSendSaQueryRequestFrame( tpAniSirGlobal pMac, tANI_U8 *transId, + tSirMacAddr peer, tpPESession psessionEntry ); //11w SA query request action frame handler tSirRetStatus limSendSaQueryResponseFrame( tpAniSirGlobal pMac, tANI_U8 *transId, tSirMacAddr peer,tpPESession psessionEntry); diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c index 56ee50dbb01b..3dbf17cdc647 100644 --- a/CORE/MAC/src/pe/lim/limUtils.c +++ b/CORE/MAC/src/pe/lim/limUtils.c @@ -57,6 +57,9 @@ #include "vos_nvitem.h" #include "pmmApi.h" +#ifdef WLAN_FEATURE_11W +#include "wniCfgAp.h" +#endif /* Static global used to mark situations where pMac->lim.gLimTriggerBackgroundScanDuringQuietBss is SET * and limTriggerBackgroundScanDuringQuietBss() returned failure. In this case, we will stop data @@ -7726,6 +7729,68 @@ tANI_BOOLEAN limIsconnectedOnDFSChannel(tANI_U8 currentChannel) } } +#ifdef WLAN_FEATURE_11W +void limPmfSaQueryTimerHandler(void *pMacGlobal, tANI_U32 param) +{ + tpAniSirGlobal pMac = (tpAniSirGlobal)pMacGlobal; + tPmfSaQueryTimerId timerId; + tpPESession psessionEntry; + tpDphHashNode pSta; + tANI_U32 maxRetries; + + limLog(pMac, LOG1, FL("SA Query timer fires")); + timerId.value = param; + + // Check that SA Query is in progress + if ((psessionEntry = peFindSessionBySessionId( + pMac, timerId.fields.sessionId)) == NULL) + { + limLog(pMac, LOGE, FL("Session does not exist for given session ID %d"), + timerId.fields.sessionId); + pSta->pmfSaQueryState = DPH_SA_QUERY_NOT_IN_PROGRESS; + return; + } + if ((pSta = dphGetHashEntry(pMac, timerId.fields.peerIdx, + &psessionEntry->dph.dphHashTable)) == NULL) + { + limLog(pMac, LOGE, FL("Entry does not exist for given peer index %d"), + timerId.fields.peerIdx); + pSta->pmfSaQueryState = DPH_SA_QUERY_NOT_IN_PROGRESS; + return; + } + if (DPH_SA_QUERY_IN_PROGRESS != pSta->pmfSaQueryState) + return; + + // Increment the retry count, check if reached maximum + if (wlan_cfgGetInt(pMac, WNI_CFG_PMF_SA_QUERY_MAX_RETRIES, + &maxRetries) != eSIR_SUCCESS) + { + limLog(pMac, LOGE, FL("Could not retrieve PMF SA Query maximum retries value")); + pSta->pmfSaQueryState = DPH_SA_QUERY_NOT_IN_PROGRESS; + return; + } + pSta->pmfSaQueryRetryCount++; + if (pSta->pmfSaQueryRetryCount >= maxRetries) + { + limLog(pMac, LOGE, FL("SA Query timed out")); + pSta->pmfSaQueryState = DPH_SA_QUERY_TIMED_OUT; + return; + } + + // Retry SA Query + limSendSaQueryRequestFrame(pMac, (tANI_U8 *)&(pSta->pmfSaQueryCurrentTransId), + pSta->staAddr, psessionEntry); + pSta->pmfSaQueryCurrentTransId++; + limLog(pMac, LOGE, FL("Starting SA Query retry %d"), pSta->pmfSaQueryRetryCount); + if (tx_timer_activate(&pSta->pmfSaQueryTimer) != TX_SUCCESS) + { + limLog(pMac, LOGE, FL("PMF SA Query timer activation failed!")); + pSta->pmfSaQueryState = DPH_SA_QUERY_NOT_IN_PROGRESS; + } +} +#endif + + #ifdef WLAN_FEATURE_11AC tANI_BOOLEAN limCheckVHTOpModeChange( tpAniSirGlobal pMac, tpPESession psessionEntry, tANI_U8 chanWidth, tANI_U8 staId) { diff --git a/CORE/MAC/src/pe/lim/limUtils.h b/CORE/MAC/src/pe/lim/limUtils.h index 6fea9f84ca11..55892de81731 100644 --- a/CORE/MAC/src/pe/lim/limUtils.h +++ b/CORE/MAC/src/pe/lim/limUtils.h @@ -84,6 +84,18 @@ typedef struct sAddBaCandidate tAddBaInfo baInfo[STACFG_MAX_TC]; }tAddBaCandidate, *tpAddBaCandidate; +#ifdef WLAN_FEATURE_11W +typedef union uPmfSaQueryTimerId +{ + struct + { + tANI_U8 sessionId; + tANI_U16 peerIdx; + } fields; + tANI_U32 value; +} tPmfSaQueryTimerId, *tpPmfSaQueryTimerId; +#endif + // LIM utility functions void limGetBssidFromPkt(tpAniSirGlobal, tANI_U8 *, tANI_U8 *, tANI_U32 *); char * limMlmStateStr(tLimMlmStates state); @@ -498,6 +510,11 @@ void limCleanUpDisassocDeauthReq(tpAniSirGlobal pMac, tANI_U8 *staMac, tANI_BOOL tANI_BOOLEAN limCheckDisassocDeauthAckPending(tpAniSirGlobal pMac, tANI_U8 *staMac); +#ifdef WLAN_FEATURE_11W +void limPmfSaQueryTimerHandler(void *pMacGlobal, tANI_U32 param); +#endif + + void limUtilsframeshtons(tpAniSirGlobal pCtx, tANI_U8 *pOut, diff --git a/CORE/SAP/inc/sapApi.h b/CORE/SAP/inc/sapApi.h index 72408a9ef18c..f7d4b3193be5 100644 --- a/CORE/SAP/inc/sapApi.h +++ b/CORE/SAP/inc/sapApi.h @@ -459,6 +459,11 @@ typedef struct sap_Config { v_BOOL_t enOverLapCh; char acsAllowedChnls[MAX_CHANNEL_LIST_LEN]; v_U16_t acsBandSwitchThreshold; + +#ifdef WLAN_FEATURE_11W + v_BOOL_t mfpRequired; + v_BOOL_t mfpCapable; +#endif } tsap_Config_t; typedef enum { diff --git a/CORE/SAP/src/sapFsm.c b/CORE/SAP/src/sapFsm.c index 5319f4965296..01809af31984 100644 --- a/CORE/SAP/src/sapFsm.c +++ b/CORE/SAP/src/sapFsm.c @@ -1442,6 +1442,12 @@ sapconvertToCsrProfile(tsap_Config_t *pconfig_params, eCsrRoamBssType bssType, t //wps config info profile->wps_state = pconfig_params->wps_state; +#ifdef WLAN_FEATURE_11W + // MFP capable/required + profile->MFPCapable = pconfig_params->mfpCapable ? 1 : 0; + profile->MFPRequired = pconfig_params->mfpRequired ? 1 : 0; +#endif + return eSAP_STATUS_SUCCESS; /* Success. */ } diff --git a/CORE/SERVICES/HIF/PCIe/if_pci.c b/CORE/SERVICES/HIF/PCIe/if_pci.c index cf83a97cec3e..b535c1ba14e8 100644 --- a/CORE/SERVICES/HIF/PCIe/if_pci.c +++ b/CORE/SERVICES/HIF/PCIe/if_pci.c @@ -732,6 +732,7 @@ again: #if PCIE_BAR0_READY_CHECKING int wait_limit = 200; #endif + int targ_awake_limit = 500; /* * Verify that the Target was started cleanly. @@ -746,7 +747,13 @@ again: */ A_PCI_WRITE32(mem + PCIE_LOCAL_BASE_ADDRESS + PCIE_SOC_WAKE_ADDRESS, PCIE_SOC_WAKE_V_MASK); while (!hif_pci_targ_is_awake(sc, mem)) { - ; + if (0 == targ_awake_limit) { + printk(KERN_ERR "%s: target awake timeout\n", __func__); + ret = -EAGAIN; + goto err_tgtstate; + } + A_MDELAY(1); + targ_awake_limit--; } #if PCIE_BAR0_READY_CHECKING diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index b4a15a1db9fc..06ef435dd2dc 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -8378,10 +8378,10 @@ static void wma_add_bss_ibss_mode(tp_wma_handle wma, tpAddBssParams add_bss) WMA_LOGE("%s: Failed to create vdev", __func__); goto send_fail_resp; } - WLANTL_RegisterVdev(wma->vos_context, vdev); - /* Register with TxRx Module for Data Ack Complete Cb */ - wdi_in_data_tx_cb_set(vdev, wma_data_tx_ack_comp_hdlr, wma); - WMA_LOGE("%s: new vdev created for IBSS", __func__); + WLANTL_RegisterVdev(wma->vos_context, vdev); + /* Register with TxRx Module for Data Ack Complete Cb */ + wdi_in_data_tx_cb_set(vdev, wma_data_tx_ack_comp_hdlr, wma); + WMA_LOGA("new IBSS vdev created with mac %pM", add_bss->selfMacAddr); /* create self peer */ status = wma_create_peer(wma, pdev, vdev, add_bss->selfMacAddr, @@ -8390,6 +8390,7 @@ static void wma_add_bss_ibss_mode(tp_wma_handle wma, tpAddBssParams add_bss) WMA_LOGE("%s: Failed to create peer", __func__); goto send_fail_resp; } + WMA_LOGA("IBSS BSS peer created with mac %pM", add_bss->selfMacAddr); peer = ol_txrx_find_peer_by_addr(pdev, add_bss->selfMacAddr, &peer_id); if (!peer) { @@ -9629,17 +9630,12 @@ static void wma_set_bsskey(tp_wma_handle wma_handle, tpSetBssKeyParams key_info) vos_mem_copy(key_params.peer_mac, wma_handle->interfaces[key_info->smesessionId].bssid, ETH_ALEN); - } - else if (wlan_op_mode_ibss == txrx_vdev->opmode) { - /* vdev mac address will be passed for IBSS mode - ** Self Mac address is supposed to be in wma_handle->hwaddr - */ - vos_mem_copy(key_params.peer_mac, wma_handle->hwaddr, - ETH_ALEN); } else { /* vdev mac address will be passed for all other modes */ vos_mem_copy(key_params.peer_mac, txrx_vdev->mac_addr.raw, ETH_ALEN); + WMA_LOGA("BSS Key setup with vdev_mac %pM\n", + txrx_vdev->mac_addr.raw); } if (key_info->numKeys == 0 && @@ -10674,7 +10670,7 @@ static void wma_send_beacon(tp_wma_handle wma, tpSendbeaconParams bcn_info) #ifndef QCA_WIFI_ISOC if (WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap, WMI_SERVICE_BEACON_OFFLOAD)) { - WMA_LOGE("%s : Beacon Offload Enabled Sending Unified command", __func__); + WMA_LOGA("Beacon Offload Enabled Sending Unified command"); if (wmi_unified_bcn_tmpl_send(wma, vdev_id, bcn_info, 4) < 0){ WMA_LOGE("%s : wmi_unified_bcn_tmpl_send Failed ", __func__); return; diff --git a/CORE/SME/inc/csrInternal.h b/CORE/SME/inc/csrInternal.h index f0ef3836c054..a837418cd48c 100644 --- a/CORE/SME/inc/csrInternal.h +++ b/CORE/SME/inc/csrInternal.h @@ -382,6 +382,10 @@ typedef struct tagCsrRoamStartBssParams tANI_U8 *pRSNIE; //If not null, it has the IE byte stream for RSN tANI_BOOLEAN updatebeaconInterval; //Flag used to indicate update // beaconInterval +#ifdef WLAN_FEATURE_11W + tANI_BOOLEAN mfpCapable; + tANI_BOOLEAN mfpRequired; +#endif }tCsrRoamStartBssParams; diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c index 49395c9cd12e..110b7d2b8a4f 100644 --- a/CORE/SME/src/csr/csrApiRoam.c +++ b/CORE/SME/src/csr/csrApiRoam.c @@ -11738,6 +11738,12 @@ eHalStatus csrRoamIssueStartBss( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRo pParam->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, pProfile, pParam->operationChn /* pProfile->operationChannel*/, &eBand); pParam->bssPersona = pProfile->csrPersona; + +#ifdef WLAN_FEATURE_11W + pParam->mfpCapable = (0 != pProfile->MFPCapable); + pParam->mfpRequired = (0 != pProfile->MFPRequired); +#endif + // When starting an IBSS, start on the channel from the Profile. status = csrSendMBStartBssReqMsg( pMac, sessionId, pProfile->BSSType, pParam, pBssDesc ); return (status); @@ -13899,6 +13905,14 @@ eHalStatus csrSendMBStartBssReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, eCs *pBuf = (tANI_U8)(tANI_U8)pMac->roam.configParam.txLdpcEnable; pBuf++; +#ifdef WLAN_FEATURE_11W + // Set MFP capable/required + *pBuf = (tANI_U8)pParam->mfpCapable; + pBuf++; + *pBuf = (tANI_U8)pParam->mfpRequired; + pBuf++; +#endif + // set RSN IE if( pParam->nRSNIELength > sizeof(pMsg->rsnIE.rsnIEdata) ) { diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c index 993565c81148..2d75ed2fd835 100644 --- a/CORE/SME/src/sme_common/sme_Api.c +++ b/CORE/SME/src/sme_common/sme_Api.c @@ -10754,7 +10754,12 @@ VOS_STATUS sme_SelectCBMode(tHalHandle hHal, eCsrPhyMode eCsrPhyMode, tANI_U8 ch eCSR_DOT11_MODE_11ac_ONLY != eCsrPhyMode && #endif eCSR_DOT11_MODE_11n != eCsrPhyMode && - eCSR_DOT11_MODE_11n_ONLY != eCsrPhyMode + eCSR_DOT11_MODE_11n_ONLY != eCsrPhyMode && + + eCSR_DOT11_MODE_11a != eCsrPhyMode && + eCSR_DOT11_MODE_11a_ONLY != eCsrPhyMode && + + eCSR_DOT11_MODE_abg != eCsrPhyMode ) { return VOS_STATUS_SUCCESS; @@ -10825,6 +10830,20 @@ VOS_STATUS sme_SelectCBMode(tHalHandle hHal, eCsrPhyMode eCsrPhyMode, tANI_U8 ch smeConfig.csrConfig.channelBondingMode5GHz = 0; } } + + /* + for 802.11a phy mode, channel bonding should be zero. + From default config, it is set as PHY_DOUBLE_CHANNEL_HIGH_PRIMARY = 3 + through csrChangeDefaultConfigParam function. We will override this + value here. + */ + if ( eCSR_DOT11_MODE_11a == eCsrPhyMode || + eCSR_DOT11_MODE_11a_ONLY == eCsrPhyMode || + eCSR_DOT11_MODE_abg == eCsrPhyMode) + { + smeConfig.csrConfig.channelBondingMode5GHz = 0; + } + VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, "cbmode selected=%d", smeConfig.csrConfig.channelBondingMode5GHz); diff --git a/CORE/SYS/legacy/src/utils/src/parserApi.c b/CORE/SYS/legacy/src/utils/src/parserApi.c index 4fd5d4405ad1..e7bdef2e07f2 100644 --- a/CORE/SYS/legacy/src/utils/src/parserApi.c +++ b/CORE/SYS/legacy/src/utils/src/parserApi.c @@ -5215,4 +5215,13 @@ void PopulateDot11fAssocRspRates ( tpAniSirGlobal pMac, tDot11fIESuppRates *pSup pExt->present = 1; } } + +void PopulateDot11fTimeoutInterval( tpAniSirGlobal pMac, + tDot11fIETimeoutInterval *pDot11f, + tANI_U8 type, tANI_U32 value ) +{ + pDot11f->present = 1; + pDot11f->timeoutType = type; + pDot11f->timeoutValue = value; +} // parserApi.c ends here. diff --git a/CORE/VOSS/src/vos_nvitem.c b/CORE/VOSS/src/vos_nvitem.c index 711d512e76a5..3f9e74e098b2 100644 --- a/CORE/VOSS/src/vos_nvitem.c +++ b/CORE/VOSS/src/vos_nvitem.c @@ -3849,6 +3849,8 @@ int wlan_hdd_crda_reg_notifier(struct wiphy *wiphy, { int status; wiphy_dbg(wiphy, "info: set by user\n"); + memset(ccode, 0, WNI_CFG_COUNTRY_CODE_LEN); + memcpy(ccode, request->alpha2, 2); init_completion(&change_country_code); /* We will process hints by user from nl80211 in driver. * sme_ChangeCountryCode will set the country to driver @@ -3864,7 +3866,7 @@ int wlan_hdd_crda_reg_notifier(struct wiphy *wiphy, status = sme_ChangeCountryCode(pHddCtx->hHal, (void *)(tSmeChangeCountryCallback) vos_nv_change_country_code_cb, - request->alpha2, + ccode, &change_country_code, pHddCtx->pvosContext, eSIR_FALSE, diff --git a/firmware_bin/WCNSS_cfg.dat b/firmware_bin/WCNSS_cfg.dat Binary files differindex a4c280d72e0f..91fb0789b06e 100644 --- a/firmware_bin/WCNSS_cfg.dat +++ b/firmware_bin/WCNSS_cfg.dat |
