summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkash Patel <akashp@codeaurora.org>2014-04-10 04:03:07 -0700
committerAkash Patel <akashp@codeaurora.org>2014-04-10 04:05:26 -0700
commitdb92983ba759f5f19ccaf2ec63ccd6d2f30a07e6 (patch)
treeb1ffbfd0534252dd9a985508076ed80a60cd7c73
parentacf08c6980a1b847047a8014cdf3f4e0bf1cad5f (diff)
parent35dd6505a8269c23273d93f248df0b164f8bfba1 (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
-rw-r--r--CORE/HDD/inc/wlan_hdd_hostapd.h2
-rw-r--r--CORE/HDD/inc/wlan_hdd_main.h6
-rw-r--r--CORE/HDD/inc/wlan_hdd_power.h2
-rw-r--r--CORE/HDD/src/wlan_hdd_assoc.c3
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c160
-rw-r--r--CORE/HDD/src/wlan_hdd_early_suspend.c120
-rw-r--r--CORE/HDD/src/wlan_hdd_ftm.c193
-rw-r--r--CORE/HDD/src/wlan_hdd_hostapd.c60
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c15
-rw-r--r--CORE/HDD/src/wlan_hdd_tx_rx.c3
-rw-r--r--CORE/MAC/inc/qwlan_version.h4
-rw-r--r--CORE/MAC/inc/sirApi.h6
-rw-r--r--CORE/MAC/inc/sirMacProtDef.h9
-rw-r--r--CORE/MAC/inc/wniCfgAp.h38
-rw-r--r--CORE/MAC/inc/wniCfgSta.h28
-rw-r--r--CORE/MAC/src/cfg/cfgParamName.c2
-rw-r--r--CORE/MAC/src/cfg/cfgUtil/cfg.txt26
-rw-r--r--CORE/MAC/src/include/dphGlobal.h19
-rw-r--r--CORE/MAC/src/include/parserApi.h4
-rw-r--r--CORE/MAC/src/pe/lim/limAssocUtils.c19
-rw-r--r--CORE/MAC/src/pe/lim/limProcessActionFrame.c52
-rw-r--r--CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c86
-rw-r--r--CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c9
-rw-r--r--CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c5
-rw-r--r--CORE/MAC/src/pe/lim/limSendManagementFrames.c186
-rw-r--r--CORE/MAC/src/pe/lim/limSerDesUtils.c11
-rw-r--r--CORE/MAC/src/pe/lim/limTypes.h4
-rw-r--r--CORE/MAC/src/pe/lim/limUtils.c65
-rw-r--r--CORE/MAC/src/pe/lim/limUtils.h17
-rw-r--r--CORE/SAP/inc/sapApi.h5
-rw-r--r--CORE/SAP/src/sapFsm.c6
-rw-r--r--CORE/SERVICES/HIF/PCIe/if_pci.c9
-rw-r--r--CORE/SERVICES/WMA/wma.c20
-rw-r--r--CORE/SME/inc/csrInternal.h4
-rw-r--r--CORE/SME/src/csr/csrApiRoam.c14
-rw-r--r--CORE/SME/src/sme_common/sme_Api.c21
-rw-r--r--CORE/SYS/legacy/src/utils/src/parserApi.c9
-rw-r--r--CORE/VOSS/src/vos_nvitem.c4
-rw-r--r--firmware_bin/WCNSS_cfg.datbin10682 -> 10746 bytes
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
index a4c280d72e0f..91fb0789b06e 100644
--- a/firmware_bin/WCNSS_cfg.dat
+++ b/firmware_bin/WCNSS_cfg.dat
Binary files differ