Merge "prima: Honour diassoc frame in add sta rsp state" into wlan-driver.lnx.1.0
diff --git a/Android.mk b/Android.mk
index e582b54..43ccc6c 100644
--- a/Android.mk
+++ b/Android.mk
@@ -48,24 +48,6 @@
WLAN_PROPRIETARY := 1
endif
-ifeq ($(WLAN_PROPRIETARY),1)
- WLAN_BLD_DIR := vendor/qcom/proprietary/wlan
-else
-ifneq ($(TARGET_SUPPORTS_WEARABLES),true)
-ifneq ($(ANDROID_BUILD_TOP),)
- WLAN_BLD_DIR := $(ANDROID_BUILD_TOP)/vendor/qcom/opensource/wlan
-else
- WLAN_BLD_DIR := vendor/qcom/opensource/wlan
-endif
-else
-ifneq ($(ANDROID_BUILD_TOP),)
- WLAN_BLD_DIR := $(ANDROID_BUILD_TOP)/device/qcom/msm8909w/opensource/wlan
-else
- WLAN_BLD_DIR := device/qcom/msm8909w/opensource/wlan
-endif
-endif
-endif
-
# DLKM_DIR was moved for JELLY_BEAN (PLATFORM_SDK 16)
ifeq (1,$(filter 1,$(shell echo "$$(( $(PLATFORM_SDK_VERSION) >= 16 ))" )))
ifneq ($(TARGET_SUPPORTS_WEARABLES),true)
@@ -128,12 +110,10 @@
# This is set once per LOCAL_PATH, not per (kernel) module
-ifneq ($(ANDROID_BUILD_TOP),)
-KBUILD_OPTIONS := WLAN_ROOT=$(WLAN_BLD_DIR)/prima
-endif
-
ifeq ($(KBUILD_OPTIONS),)
-KBUILD_OPTIONS := WLAN_ROOT=$(KERNEL_TO_BUILD_ROOT_OFFSET)$(WLAN_BLD_DIR)/prima
+KBUILD_OPTIONS += WLAN_PROPRIETARY=$(WLAN_PROPRIETARY)
+KBUILD_OPTIONS += TARGET_SUPPORTS_WEARABLES=$(TARGET_SUPPORTS_WEARABLES)
+KBUILD_OPTIONS += KERNEL_TO_BUILD_ROOT_OFFSET=$(KERNEL_TO_BUILD_ROOT_OFFSET)
endif
# We are actually building wlan.ko here, as per the
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 0884b71..e62dbe9 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -61,6 +61,12 @@
#define WLAN_PSK_STRING_LENGTH (64)
#endif /* SAP_AUTH_OFFLOAD */
+/*
+ * Maximum length of the default SAP interface created using
+ * gEnabledefaultSAP ini param.
+ */
+#define CFG_CONCURRENT_IFACE_MAX_LEN 16
+
// Defines for all of the things we read from the configuration (registry).
#define CFG_RTS_THRESHOLD_NAME "RTSThreshold"
@@ -3248,6 +3254,23 @@
#define CFG_FORCE_RSNE_OVERRIDE_MAX (1)
#define CFG_FORCE_RSNE_OVERRIDE_DEFAULT (0)
+/*
+ * <ini>
+ * gEnabledefaultSAP - This will control the creation of default SAP
+ * interface
+ * @Default: NULL
+ *
+ * This ini is used for providing control to create a default SAP session
+ * along with the creation of wlan0 and p2p0. The name of the interface is
+ * specified as the parameter
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_ENABLE_DEFAULT_SAP "gEnabledefaultSAP"
+#define CFG_ENABLE_DEFAULT_SAP_DEFAULT ""
+
/*---------------------------------------------------------------------------
Type declarations
-------------------------------------------------------------------------*/
@@ -3864,7 +3887,7 @@
uint32_t btc_dyn_num_bt_ext;
bool indoor_channel_support;
bool force_rsne_override;
-
+ char enabledefaultSAP[CFG_CONCURRENT_IFACE_MAX_LEN];
} hdd_config_t;
/*---------------------------------------------------------------------------
diff --git a/CORE/HDD/inc/wlan_hdd_cfg80211.h b/CORE/HDD/inc/wlan_hdd_cfg80211.h
index a6f5a35..9ef5a8c 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg80211.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg80211.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -1391,10 +1391,10 @@
QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_RATE_FLAGS = 2,
/* Unsigned 32bit value for operating frequency */
QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_FREQ = 3,
- /* Unsigned 32bit value for STA flags*/
- QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_STA_FLAGS = 4,
/* An array of 6 Unsigned 8bit values for the STA MAC address*/
- QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_STA_MAC = 5,
+ QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_MAC_ADDR = 4,
+ /* Unsigned 32bit value for STA flags*/
+ QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_STA_FLAGS = 5,
/* KEEP LAST */
QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_AFTER_LAST,
@@ -1733,6 +1733,29 @@
int wlan_hdd_restore_channels(hdd_context_t *pHddCtx);
/*
+ * wlan_hdd_disable_channels() - Cache the the channels
+ * and current state of the channels from the channel list
+ * received in the command and disable the channels on the
+ * wiphy and NV table.
+ * @hdd_ctx: Pointer to hdd context
+ *
+ * @return: 0 on success, Error code on failure
+ */
+int wlan_hdd_disable_channels(hdd_context_t *hdd_ctx);
+
+/*
+ * hdd_check_and_disconnect_sta_on_invalid_channel() - Disconnect STA if it is
+ * on indoor channel
+ * @hdd_ctx: pointer to hdd context
+ *
+ * STA should be disconnected before starting the SAP if it is on indoor
+ * channel.
+ *
+ * Return: void
+ */
+void hdd_check_and_disconnect_sta_on_invalid_channel(hdd_context_t *hdd_ctx);
+
+/*
* hdd_update_indoor_channel() - enable/disable indoor channel
* @hdd_ctx: hdd context
* @disable: whether to enable / disable indoor channel
@@ -1853,8 +1876,15 @@
}
#endif
-struct cfg80211_bss* wlan_hdd_cfg80211_update_bss_list(
- hdd_adapter_t *pAdapter, tSirMacAddr bssid);
+/*
+ * wlan_hdd_cfg80211_unlink_bss :to inform nl80211
+ * interface that BSS might have been lost.
+ * @pAdapter: adapter
+ * @bssid: bssid which might have been lost
+ *
+ * Return: void
+ */
+void wlan_hdd_cfg80211_unlink_bss(hdd_adapter_t *pAdapter, tSirMacAddr bssid);
struct cfg80211_bss *wlan_hdd_cfg80211_inform_bss_frame(hdd_adapter_t *pAdapter,
tSirBssDescription *bss_desc);
@@ -1900,4 +1930,24 @@
*/
int wlan_hdd_disconnect(hdd_adapter_t *pAdapter, u16 reason);
+#if defined(CFG80211_SCAN_RANDOM_MAC_ADDR) || \
+ (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
+/**
+ * wlan_hdd_cfg80211_scan_randomization_init() - Enable NL80211 scan randomize
+ * @wiphy: Pointer to wiphy structure
+ *
+ * This function is used to enable NL80211 scan randomization feature when
+ * ini: gEnableMacAddrSpoof is set to MAC_ADDR_SPOOFING_FW_HOST_ENABLE and
+ * cfg80211 supports scan randomization.
+ *
+ * Return: None
+ */
+void wlan_hdd_cfg80211_scan_randomization_init(struct wiphy *wiphy);
+#else
+static inline
+void wlan_hdd_cfg80211_scan_randomization_init(struct wiphy *wiphy)
+{
+}
+#endif
+
#endif
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index 3e473cf..e8ab954 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -134,6 +134,8 @@
#define FW_STATE_WAIT_TIME 500
#define FW_STATE_RSP_LEN 100
+#define WLAN_WAIT_TIME_FEATURE_CAPS 300
+
/* Amount of time to wait for sme close session callback.
This value should be larger than the timeout used by WDI to wait for
a response from WCNSS */
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index f7ce1b8..aa6bf28 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -1872,7 +1872,7 @@
/* clear scan cache for Link Lost */
if (pRoamInfo && !pRoamInfo->reasonCode &&
(eCSR_ROAM_LOSTLINK == roamStatus)) {
- wlan_hdd_cfg80211_update_bss_list(pAdapter,
+ wlan_hdd_cfg80211_unlink_bss(pAdapter,
pHddStaCtx->conn_info.bssId);
sme_remove_bssid_from_scan_list(pHddCtx->hHal,
pHddStaCtx->conn_info.bssId);
@@ -2668,7 +2668,7 @@
((eSIR_SME_JOIN_TIMEOUT_RESULT_CODE == pRoamInfo->statusCode) ||
(eSIR_SME_AUTH_TIMEOUT_RESULT_CODE == pRoamInfo->statusCode) ||
(eSIR_SME_ASSOC_TIMEOUT_RESULT_CODE == pRoamInfo->statusCode)))) {
- wlan_hdd_cfg80211_update_bss_list(pAdapter,
+ wlan_hdd_cfg80211_unlink_bss(pAdapter,
pRoamInfo ? pRoamInfo->bssid : pWextState->req_bssId);
sme_remove_bssid_from_scan_list(pHddCtx->hHal,
pRoamInfo ? pRoamInfo->bssid : pWextState->req_bssId);
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 6a2e23a..050d9b8 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -4035,6 +4035,11 @@
CFG_FORCE_RSNE_OVERRIDE_MIN,
CFG_FORCE_RSNE_OVERRIDE_MAX),
+ REG_VARIABLE_STRING(CFG_ENABLE_DEFAULT_SAP, WLAN_PARAM_String,
+ hdd_config_t, enabledefaultSAP,
+ VAR_FLAGS_NONE,
+ (void *)CFG_ENABLE_DEFAULT_SAP_DEFAULT),
+
};
/*
@@ -4708,6 +4713,10 @@
"Name = [%s] Value = [%u] ",
CFG_FORCE_RSNE_OVERRIDE_NAME,
pHddCtx->cfg_ini->force_rsne_override);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
+ "Name = [%s] Value = [%s] ",
+ CFG_ENABLE_DEFAULT_SAP,
+ pHddCtx->cfg_ini->enabledefaultSAP);
}
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 4bed869..166217e 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -311,6 +311,9 @@
.ht_cap.mcs.rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
.ht_cap.mcs.rx_highest = cpu_to_le16( 72 ),
.ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED,
+ .vht_cap.vht_supported = 1,
+ .vht_cap.cap = IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454
+ | IEEE80211_VHT_CAP_SHORT_GI_80,
};
static struct ieee80211_supported_band wlan_hdd_band_5_GHZ =
@@ -332,6 +335,9 @@
.ht_cap.mcs.rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
.ht_cap.mcs.rx_highest = cpu_to_le16( 72 ),
.ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED,
+ .vht_cap.vht_supported = 1,
+ .vht_cap.cap = IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454
+ | IEEE80211_VHT_CAP_SHORT_GI_80,
};
/* This structure contain information what kind of frame are expected in
@@ -1917,6 +1923,7 @@
stats->rateStats +
(i * sizeof(tSirWifiRateStat)));
rates = nla_nest_start(vendor_event, i);
+
if(!rates)
return FALSE;
@@ -2402,10 +2409,10 @@
return;
}
- pWifiPeerInfo = (tpSirWifiPeerInfo) ((uint8 *)
- pWifiPeerStat->peerInfo +
- (i * sizeof(tSirWifiPeerInfo)) +
- (numRate * sizeof (tSirWifiRateStat)));
+ pWifiPeerInfo = (tpSirWifiPeerInfo)((uint8 *)pWifiPeerInfo +
+ (sizeof(tSirWifiPeerInfo) - sizeof(tSirWifiRateStat)) +
+ (numRate * sizeof(tSirWifiRateStat)));
+
nla_nest_end(vendor_event, peers);
}
nla_nest_end(vendor_event, peerInfo);
@@ -2795,6 +2802,14 @@
FL("HDD adapter is Null"));
return -ENODEV;
}
+
+ if (pAdapter->device_mode != WLAN_HDD_INFRA_STATION) {
+ hddLog(VOS_TRACE_LEVEL_DEBUG,
+ "Cannot set LL_STATS for device mode %d",
+ pAdapter->device_mode);
+ return -EINVAL;
+ }
+
/* check the LLStats Capability */
if ( (TRUE != pHddCtx->cfg_ini->fEnableLLStats) ||
(TRUE != sme_IsFeatureSupportedByFW(LINK_LAYER_STATS_MEAS)))
@@ -4309,6 +4324,42 @@
EXIT();
}
+static bool wlan_hdd_is_extscan_supported(hdd_adapter_t *adapter,
+ hdd_context_t *hdd_ctx)
+{
+ int status;
+
+ status = wlan_hdd_validate_context(hdd_ctx);
+ if (status)
+ return false;
+
+ if (!adapter) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("Invalid adapter"));
+ return false;
+ }
+
+ if (adapter->device_mode != WLAN_HDD_INFRA_STATION) {
+ hddLog(VOS_TRACE_LEVEL_INFO,
+ FL("ext scans only supported on STA ifaces"));
+ return false;
+ }
+
+ if (VOS_FTM_MODE == hdd_get_conparam()) {
+ hddLog(LOGE, FL("Command not allowed in FTM mode"));
+ return false;
+ }
+
+ /* check the EXTScan Capability */
+ if ( (TRUE != hdd_ctx->cfg_ini->fEnableEXTScan) ||
+ (TRUE != sme_IsFeatureSupportedByFW(EXTENDED_SCAN)) ||
+ (TRUE != sme_IsFeatureSupportedByFW(EXT_SCAN_ENHANCED))) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("EXTScan not enabled/supported by Firmware"));
+ return false;
+ }
+ return true;
+}
+
static int __wlan_hdd_cfg80211_extscan_get_capabilities(struct wiphy *wiphy,
struct wireless_dev *wdev,
const void *data, int dataLen)
@@ -4326,20 +4377,8 @@
ENTER();
- status = wlan_hdd_validate_context(pHddCtx);
- if (0 != status)
- {
+ if (!wlan_hdd_is_extscan_supported(pAdapter, pHddCtx))
return -EINVAL;
- }
- /* check the EXTScan Capability */
- if ( (TRUE != pHddCtx->cfg_ini->fEnableEXTScan) ||
- (TRUE != sme_IsFeatureSupportedByFW(EXTENDED_SCAN)) ||
- (TRUE != sme_IsFeatureSupportedByFW(EXT_SCAN_ENHANCED)))
- {
- hddLog(VOS_TRACE_LEVEL_ERROR,
- FL("EXTScan not enabled/supported by Firmware"));
- return -EINVAL;
- }
if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX,
data, dataLen,
@@ -4421,25 +4460,8 @@
ENTER();
- if (VOS_FTM_MODE == hdd_get_conparam()) {
- hddLog(LOGE, FL("Command not allowed in FTM mode"));
+ if (!wlan_hdd_is_extscan_supported(pAdapter, pHddCtx))
return -EINVAL;
- }
-
- status = wlan_hdd_validate_context(pHddCtx);
- if (0 != status)
- {
- return -EINVAL;
- }
- /* check the EXTScan Capability */
- if ( (TRUE != pHddCtx->cfg_ini->fEnableEXTScan) ||
- (TRUE != sme_IsFeatureSupportedByFW(EXTENDED_SCAN)) ||
- (TRUE != sme_IsFeatureSupportedByFW(EXT_SCAN_ENHANCED)))
- {
- hddLog(VOS_TRACE_LEVEL_ERROR,
- FL("EXTScan not enabled/supported by Firmware"));
- return -EINVAL;
- }
if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX,
data, dataLen,
@@ -4543,25 +4565,8 @@
ENTER();
- if (VOS_FTM_MODE == hdd_get_conparam()) {
- hddLog(LOGE, FL("Command not allowed in FTM mode"));
+ if (!wlan_hdd_is_extscan_supported(pAdapter, pHddCtx))
return -EINVAL;
- }
-
- status = wlan_hdd_validate_context(pHddCtx);
- if (0 != status)
- {
- return -EINVAL;
- }
- /* check the EXTScan Capability */
- if ( (TRUE != pHddCtx->cfg_ini->fEnableEXTScan) ||
- (TRUE != sme_IsFeatureSupportedByFW(EXTENDED_SCAN)) ||
- (TRUE != sme_IsFeatureSupportedByFW(EXT_SCAN_ENHANCED)))
- {
- hddLog(VOS_TRACE_LEVEL_ERROR,
- FL("EXTScan not enabled/supported by Firmware"));
- return -EINVAL;
- }
if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX,
data, dataLen,
@@ -4740,11 +4745,8 @@
ENTER();
- status = wlan_hdd_validate_context(pHddCtx);
- if (0 != status)
- {
+ if (!wlan_hdd_is_extscan_supported(pAdapter, pHddCtx))
return -EINVAL;
- }
if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX,
data, dataLen,
@@ -5093,6 +5095,11 @@
j++;
}
+ if (j != pReqMsg->buckets[bktIndex].numChannels) {
+ hddLog(LOG1, FL("Input parameters didn't match"));
+ return -EINVAL;
+ }
+
bktIndex++;
}
@@ -5136,25 +5143,8 @@
ENTER();
- if (VOS_FTM_MODE == hdd_get_conparam()) {
- hddLog(LOGE, FL("Command not allowed in FTM mode"));
+ if (!wlan_hdd_is_extscan_supported(pAdapter, pHddCtx))
return -EINVAL;
- }
-
- status = wlan_hdd_validate_context(pHddCtx);
- if (0 != status)
- {
- return -EINVAL;
- }
- /* check the EXTScan Capability */
- if ( (TRUE != pHddCtx->cfg_ini->fEnableEXTScan) ||
- (TRUE != sme_IsFeatureSupportedByFW(EXTENDED_SCAN)) ||
- (TRUE != sme_IsFeatureSupportedByFW(EXT_SCAN_ENHANCED)))
- {
- hddLog(VOS_TRACE_LEVEL_ERROR,
- FL("EXTScan not enabled/supported by Firmware"));
- return -EINVAL;
- }
if (nla_parse(tb, PARAM_MAX,
data, dataLen,
@@ -5330,25 +5320,8 @@
ENTER();
- if (VOS_FTM_MODE == hdd_get_conparam()) {
- hddLog(LOGE, FL("Command not allowed in FTM mode"));
+ if (!wlan_hdd_is_extscan_supported(pAdapter, pHddCtx))
return -EINVAL;
- }
-
- status = wlan_hdd_validate_context(pHddCtx);
- if (0 != status)
- {
- return -EINVAL;
- }
- /* check the EXTScan Capability */
- if ( (TRUE != pHddCtx->cfg_ini->fEnableEXTScan) ||
- (TRUE != sme_IsFeatureSupportedByFW(EXTENDED_SCAN)) ||
- (TRUE != sme_IsFeatureSupportedByFW(EXT_SCAN_ENHANCED)))
- {
- hddLog(VOS_TRACE_LEVEL_ERROR,
- FL("EXTScan not enabled/supported by Firmware"));
- return -EINVAL;
- }
if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX,
data, dataLen,
@@ -5435,26 +5408,8 @@
ENTER();
- if (VOS_FTM_MODE == hdd_get_conparam()) {
- hddLog(LOGE, FL("Command not allowed in FTM mode"));
+ if (!wlan_hdd_is_extscan_supported(pAdapter, pHddCtx))
return -EINVAL;
- }
-
- status = wlan_hdd_validate_context(pHddCtx);
- if (0 != status)
- {
- hddLog(LOGE, FL("HDD context is not valid"));
- return -EINVAL;
- }
- /* check the EXTScan Capability */
- if ( (TRUE != pHddCtx->cfg_ini->fEnableEXTScan) ||
- (TRUE != sme_IsFeatureSupportedByFW(EXTENDED_SCAN)) ||
- (TRUE != sme_IsFeatureSupportedByFW(EXT_SCAN_ENHANCED)))
- {
- hddLog(VOS_TRACE_LEVEL_ERROR,
- FL("EXTScan not enabled/supported by Firmware"));
- return -EINVAL;
- }
if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX,
data, dataLen,
@@ -5591,6 +5546,7 @@
{
hdd_context_t *pHddCtx = wiphy_priv(wiphy);
+ hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(wdev->netdev);
struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_SET_SCANNING_MAC_OUI_MAX + 1];
ENTER();
@@ -5598,6 +5554,17 @@
if (0 != wlan_hdd_validate_context(pHddCtx)){
return -EINVAL;
}
+
+ if (!adapter) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("HDD adpater is NULL"));
+ return -EINVAL;
+ }
+
+ if (adapter->device_mode != WLAN_HDD_INFRA_STATION) {
+ hddLog(VOS_TRACE_LEVEL_INFO, FL("MAC_SPOOFED_SCAN allowed only in STA"));
+ return -ENOTSUPP;
+ }
+
if (0 == pHddCtx->cfg_ini->enableMacSpoofing) {
hddLog(VOS_TRACE_LEVEL_INFO, FL("MAC_SPOOFED_SCAN disabled in ini"));
return -ENOTSUPP;
@@ -9158,6 +9125,20 @@
}
#endif
+#if defined(CFG80211_SCAN_RANDOM_MAC_ADDR) || \
+ (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
+void wlan_hdd_cfg80211_scan_randomization_init(struct wiphy *wiphy)
+{
+ hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
+ hdd_config_t *config = hdd_ctx->cfg_ini;
+
+ if (config->enableMacSpoofing != MAC_ADDR_SPOOFING_FW_HOST_ENABLE)
+ return;
+
+ wiphy->features |= NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
+}
+#endif
+
/*
* FUNCTION: wlan_hdd_cfg80211_init
* This function is called by hdd_wlan_startup()
@@ -10779,16 +10760,6 @@
return result;
}
-/*
- * hdd_check_and_disconnect_sta_on_invalid_channel() - Disconnect STA if it is
- * on indoor channel
- * @hdd_ctx: pointer to hdd context
- *
- * STA should be disconnected before starting the SAP if it is on indoor
- * channel.
- *
- * Return: void
- */
void hdd_check_and_disconnect_sta_on_invalid_channel(hdd_context_t *hdd_ctx)
{
@@ -10878,6 +10849,13 @@
wiphy_channel->flags =
cache_chann->
channel_info[i].wiphy_status;
+ hddLog(VOS_TRACE_LEVEL_DEBUG,
+ "Restore channel %d reg_stat %d wiphy_stat 0x%x",
+ cache_chann->
+ channel_info[i].channel_num,
+ cache_chann->
+ channel_info[i].reg_status,
+ wiphy_channel->flags);
break;
}
}
@@ -10896,17 +10874,7 @@
return 0;
}
-/*
- * wlan_hdd_disable_channels() - Cache the the channels
- * and current state of the channels from the channel list
- * received in the command and disable the channels on the
- * wiphy and NV table.
- * @hdd_ctx: Pointer to hdd context
- *
- * @return: 0 on success, Error code on failure
- */
-
-static int wlan_hdd_disable_channels(hdd_context_t *hdd_ctx)
+int wlan_hdd_disable_channels(hdd_context_t *hdd_ctx)
{
struct hdd_cache_channels *cache_chann;
struct wiphy *wiphy;
@@ -11071,12 +11039,6 @@
hdd_check_and_disconnect_sta_on_invalid_channel(pHddCtx);
}
- if (pHostapdAdapter->device_mode == WLAN_HDD_SOFTAP) {
- /* Disable the channels received in command SET_DISABLE_CHANNEL_LIST*/
- wlan_hdd_disable_channels(pHddCtx);
- hdd_check_and_disconnect_sta_on_invalid_channel(pHddCtx);
- }
-
pHostapdState = WLAN_HDD_GET_HOSTAP_STATE_PTR(pHostapdAdapter);
pConfig = &pHostapdAdapter->sessionCtx.ap.sapConfig;
@@ -11675,8 +11637,6 @@
return 0;
error:
- if (pHostapdAdapter->device_mode == WLAN_HDD_SOFTAP)
- wlan_hdd_restore_channels(pHddCtx);
/* Revert the indoor to passive marking if START BSS fails */
if (iniConfig->disable_indoor_channel &&
pHostapdAdapter->device_mode == WLAN_HDD_SOFTAP) {
@@ -12300,6 +12260,7 @@
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( ndev );
hdd_context_t *pHddCtx;
tCsrRoamProfile *pRoamProfile = NULL;
+ hdd_adapter_t *pP2pAdapter = NULL;
eCsrRoamBssType LastBSSType;
hdd_config_t *pConfig = NULL;
eMib_dot11DesiredBssType connectedBssType;
@@ -12464,6 +12425,30 @@
{
wlan_hdd_cancel_existing_remain_on_channel(pAdapter);
}
+ if (NL80211_IFTYPE_AP == type)
+ {
+ /*
+ * As Loading WLAN Driver one interface being created
+ * for p2p device address. This will take one HW STA and
+ * the max number of clients that can connect to softAP
+ * will be reduced by one. so while changing the interface
+ * type to NL80211_IFTYPE_AP (SoftAP) remove p2p0 interface
+ * as it is not required in SoftAP mode.
+ */
+
+ // Get P2P Adapter
+ pP2pAdapter = hdd_get_adapter(pHddCtx,
+ WLAN_HDD_P2P_DEVICE);
+ if (pP2pAdapter)
+ {
+ wlan_hdd_release_intf_addr(pHddCtx,
+ pP2pAdapter->macAddressCurrent.bytes);
+ hdd_stop_adapter(pHddCtx, pP2pAdapter, VOS_TRUE);
+ hdd_deinit_adapter(pHddCtx, pP2pAdapter, TRUE);
+ hdd_close_adapter(pHddCtx, pP2pAdapter, VOS_TRUE);
+ }
+ }
+
//Disable IMPS & BMPS for SAP/GO
if(VOS_STATUS_E_FAILURE ==
hdd_disable_bmps_imps(pHddCtx, WLAN_HDD_P2P_GO))
@@ -12601,7 +12586,19 @@
case NL80211_IFTYPE_P2P_CLIENT:
case NL80211_IFTYPE_ADHOC:
+ if (pAdapter->device_mode == WLAN_HDD_SOFTAP
+ && !hdd_get_adapter(pHddCtx, WLAN_HDD_P2P_DEVICE)) {
+ /*
+ * The p2p interface was deleted while SoftAP mode was init,
+ * create that interface now that the SoftAP is going down.
+ */
+ pP2pAdapter = hdd_open_adapter(pHddCtx, WLAN_HDD_P2P_DEVICE,
+ "p2p%d", wlan_hdd_get_intf_addr(pHddCtx),
+ VOS_TRUE);
+ }
+
hdd_stop_adapter( pHddCtx, pAdapter, VOS_TRUE );
+
#ifdef FEATURE_WLAN_TDLS
/* A Mutex Lock is introduced while changing the mode to
@@ -13009,8 +13006,8 @@
const v_MACADDR_t *mac_addr)
{
struct sk_buff *vendor_event;
- uint32_t sta_flags = 0;
VOS_STATUS status;
+ struct nl80211_sta_flag_update sta_flags;
ENTER();
@@ -13035,18 +13032,22 @@
return -EINVAL;
}
- sta_flags |= BIT(NL80211_STA_FLAG_AUTHORIZED);
+ sta_flags.mask |= BIT(NL80211_STA_FLAG_AUTHORIZED);
+ sta_flags.set = true;
- status = nla_put_u32(vendor_event,
- QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_STA_FLAGS,
- sta_flags);
+ status = nla_put(vendor_event,
+ QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_STA_FLAGS,
+ sizeof(struct nl80211_sta_flag_update),
+ &sta_flags);
+
if (status) {
hddLog(VOS_TRACE_LEVEL_ERROR, FL("STA flag put fails"));
kfree_skb(vendor_event);
return VOS_STATUS_E_FAILURE;
}
+
status = nla_put(vendor_event,
- QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_STA_MAC,
+ QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_MAC_ADDR,
VOS_MAC_ADDR_SIZE, mac_addr->bytes);
if (status) {
hddLog(VOS_TRACE_LEVEL_ERROR, FL("STA MAC put fails"));
@@ -14250,16 +14251,7 @@
rssi, GFP_KERNEL );
}
-/*
- * wlan_hdd_cfg80211_update_bss_list :to inform nl80211
- * interface that BSS might have been lost.
- * @pAdapter: adaptor
- * @bssid: bssid which might have been lost
- *
- * Return: bss which is unlinked from kernel cache
- */
-struct cfg80211_bss* wlan_hdd_cfg80211_update_bss_list(
- hdd_adapter_t *pAdapter, tSirMacAddr bssid)
+void wlan_hdd_cfg80211_unlink_bss(hdd_adapter_t *pAdapter, tSirMacAddr bssid)
{
struct net_device *dev = pAdapter->dev;
struct wireless_dev *wdev = dev->ieee80211_ptr;
@@ -14269,14 +14261,15 @@
bss = hdd_get_bss_entry(wiphy,
NULL, bssid,
NULL, 0);
- if (bss == NULL) {
+ if (!bss) {
hddLog(LOGE, FL("BSS not present"));
} else {
hddLog(LOG1, FL("cfg80211_unlink_bss called for BSSID "
MAC_ADDRESS_STR), MAC_ADDR_ARRAY(bssid));
cfg80211_unlink_bss(wiphy, bss);
+ /* cfg80211_get_bss get bss with ref count so release it */
+ cfg80211_put_bss(wiphy, bss);
}
- return bss;
}
@@ -15220,6 +15213,207 @@
}
#endif
+#if defined(CFG80211_SCAN_RANDOM_MAC_ADDR) || \
+ (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
+/**
+ * hdd_is_wiphy_scan_random_support() - Check NL80211 scan randomization support
+ * @wiphy: Pointer to wiphy structure
+ *
+ * This function is used to check whether @wiphy supports
+ * NL80211 scan randomization feature.
+ *
+ * Return: If randomization is supported then return true else false.
+ */
+static bool
+hdd_is_wiphy_scan_random_support(struct wiphy *wiphy)
+{
+ if (wiphy->features & NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR)
+ return true;
+
+ return false;
+}
+
+/**
+ * hdd_is_nl_scan_random() - Check for randomization flag in cfg80211 scan
+ * @nl_scan: cfg80211 scan request
+ *
+ * This function is used to check whether scan randomization flag is set for
+ * current cfg80211 scan request identified by @nl_scan.
+ *
+ * Return: If randomization flag is set then return true else false.
+ */
+static bool
+hdd_is_nl_scan_random(struct cfg80211_scan_request *nl_scan)
+{
+ if (nl_scan->flags & NL80211_SCAN_FLAG_RANDOM_ADDR)
+ return true;
+
+ return false;
+}
+#else
+static bool
+hdd_is_wiphy_scan_random_support(struct wiphy *wiphy)
+{
+ return false;
+}
+
+static bool
+hdd_is_nl_scan_random(struct cfg80211_scan_request *nl_scan)
+{
+ return false;
+}
+#endif
+
+/**
+ * hdd_generate_scan_random_mac() - Generate Random mac addr for cfg80211 scan
+ * @mac_addr: Input mac-addr from which random-mac address is to be generated
+ * @mac_mask: Bits of mac_addr which should not be randomized
+ * @random_mac: Output pointer to hold generated random mac address
+ *
+ * This function is used generate random mac address using @mac_addr and
+ * @mac_mask with following logic:
+ * Bit value 0 in the mask means that we should randomize that bit.
+ * Bit value 1 in the mask means that we should take specific bit value
+ * from mac address provided.
+ *
+ * Return: None
+ */
+static void
+hdd_generate_scan_random_mac(uint8_t *mac_addr, uint8_t *mac_mask,
+ uint8_t *random_mac)
+{
+ uint32_t i;
+ uint8_t random_byte;
+
+ for (i = 0; i < VOS_MAC_ADDRESS_LEN; i++) {
+ random_byte = 0;
+ get_random_bytes(&random_byte, 1);
+ random_mac[i] = (mac_addr[i] & mac_mask[i]) |
+ (random_byte & (~(mac_mask[i])));
+ }
+
+ /*
+ * Make sure locally administered bit is set if that
+ * particular bit in the mask is 0
+ */
+ if (!(mac_mask[0] & 0x2))
+ random_mac[0] |= 0x2;
+
+ /*
+ * Make sure multicast/group address bit is NOT set if that
+ * particular bit in the mask is 0
+ */
+ if (!(mac_mask[0] & 0x1))
+ random_mac[0] &= ~0x1;
+}
+
+/**
+ * hdd_spoof_scan() - Spoof cfg80211 scan
+ * @wiphy: Pointer to wiphy
+ * @adapter: Pointer to adapter for which scan is requested
+ * @nl_scan: Cfg80211 scan request
+ * @is_p2p_scan: Check for p2p scan
+ * @csr_scan: Pointer to internal (csr) scan request
+ *
+ * This function is used for following purposes:
+ * (a) If cfg80211 supports scan randomization then this function invokes helper
+ * functions to generate random-mac address.
+ * (b) If the cfg80211 doesn't support scan randomization then randomize scans
+ * using spoof mac received with VENDOR_SUBCMD_MAC_OUI.
+ * (c) Configure the random-mac in transport layer.
+ *
+ * Return: For success return 0 else return negative value.
+ */
+static int
+hdd_spoof_scan(struct wiphy *wiphy, hdd_adapter_t *adapter,
+ struct cfg80211_scan_request *nl_scan,
+ bool is_p2p_scan, tCsrScanRequest *csr_scan)
+{
+ hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
+ hdd_config_t *config = hdd_ctx->cfg_ini;
+ uint8_t random_mac[VOS_MAC_ADDRESS_LEN];
+ VOS_STATUS vos_status;
+ eHalStatus hal_status;
+
+ csr_scan->nl_scan = true;
+ csr_scan->scan_randomize = false;
+
+ if (config->enableMacSpoofing != MAC_ADDR_SPOOFING_FW_HOST_ENABLE ||
+ !sme_IsFeatureSupportedByFW(MAC_SPOOFED_SCAN))
+ return 0;
+
+ vos_flush_delayed_work(&hdd_ctx->spoof_mac_addr_work);
+
+ if (hdd_is_wiphy_scan_random_support(wiphy)) {
+ if (!hdd_is_nl_scan_random(nl_scan) || is_p2p_scan)
+ return 0;
+
+ hdd_generate_scan_random_mac(nl_scan->mac_addr,
+ nl_scan->mac_addr_mask,
+ random_mac);
+
+ hddLog(VOS_TRACE_LEVEL_INFO,
+ FL("cfg80211 scan random attributes:"));
+ hddLog(VOS_TRACE_LEVEL_INFO, "mac-addr: "MAC_ADDRESS_STR
+ " mac-mask: "MAC_ADDRESS_STR
+ " random-mac: "MAC_ADDRESS_STR,
+ MAC_ADDR_ARRAY(nl_scan->mac_addr),
+ MAC_ADDR_ARRAY(nl_scan->mac_addr_mask),
+ MAC_ADDR_ARRAY(random_mac));
+
+ hal_status = sme_SpoofMacAddrReq(hdd_ctx->hHal,
+ (v_MACADDR_t *)random_mac,
+ false);
+ if (hal_status != eHAL_STATUS_SUCCESS) {
+ hddLog(LOGE,
+ FL("Send of Spoof request failed"));
+ hddLog(LOGE,
+ FL("Disable spoofing and use self-mac"));
+ return 0;
+ }
+
+ vos_status = WLANTL_updateSpoofMacAddr(hdd_ctx->pvosContext,
+ (v_MACADDR_t*)random_mac,
+ &adapter->macAddressCurrent);
+ if(vos_status != VOS_STATUS_SUCCESS) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("Failed to update spoof mac in TL"));
+ return -EINVAL;
+ }
+
+ csr_scan->scan_randomize = true;
+
+ return 0;
+ }
+
+ /*
+ * If wiphy does not support cfg80211 scan randomization then scan
+ * will be randomized using the vendor MAC OUI.
+ */
+ if (!hdd_ctx->spoofMacAddr.isEnabled)
+ return 0;
+
+ hddLog(VOS_TRACE_LEVEL_INFO,
+ FL("MAC Spoofing enabled for current scan and spoof addr is:"
+ MAC_ADDRESS_STR),
+ MAC_ADDR_ARRAY(hdd_ctx->spoofMacAddr.randomMacAddr.bytes));
+
+ /* Updating SelfSta Mac Addr in TL which will be used to get staidx
+ * to fill TxBds for probe request during current scan
+ */
+ vos_status = WLANTL_updateSpoofMacAddr(hdd_ctx->pvosContext,
+ &hdd_ctx->spoofMacAddr.randomMacAddr, &adapter->macAddressCurrent);
+ if(vos_status != VOS_STATUS_SUCCESS) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("Failed to update spoof mac in TL"));
+ return -EINVAL;
+ }
+
+ csr_scan->scan_randomize = true;
+
+ return 0;
+}
+
/*
* FUNCTION: __wlan_hdd_cfg80211_scan
* this scan respond to scan trigger and update cfg80211 scan database
@@ -15710,27 +15904,16 @@
scanRequest.minChnTime, scanRequest.maxChnTime,
scanRequest.p2pSearch, scanRequest.skipDfsChnlInP2pSearch);
- if (pHddCtx->spoofMacAddr.isEnabled &&
- pHddCtx->cfg_ini->enableMacSpoofing == 1)
- {
- hddLog(VOS_TRACE_LEVEL_INFO,
- "%s: MAC Spoofing enabled for current scan", __func__);
- /* Updating SelfSta Mac Addr in TL which will be used to get staidx
- * to fill TxBds for probe request during current scan
- */
- status = WLANTL_updateSpoofMacAddr(pHddCtx->pvosContext,
- &pHddCtx->spoofMacAddr.randomMacAddr, &pAdapter->macAddressCurrent);
-
- if(status != VOS_STATUS_SUCCESS)
- {
- hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_SCAN);
- status = -EFAULT;
+ ret = hdd_spoof_scan(wiphy, pAdapter, request, is_p2p_scan, &scanRequest);
+ if(ret) {
+ hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_SCAN);
+ status = -EFAULT;
#ifdef FEATURE_WLAN_TDLS
wlan_hdd_tdls_scan_done_callback(pAdapter);
#endif
- goto free_mem;
- }
+ goto free_mem;
}
+
wlan_hdd_get_frame_logs(pAdapter, WLAN_HDD_GET_FRAME_LOG_CMD_CLEAR);
status = sme_ScanRequest( WLAN_HDD_GET_HAL_CTX(pAdapter),
pAdapter->sessionId, &scanRequest, &scanId,
@@ -19314,7 +19497,7 @@
}
#ifdef WLAN_FEATURE_VOWIFI_11R_DEBUG
- hddLog(LOGE, FL("%s called with Ie of length = %zu"), __func__,
+ hddLog(LOG1, FL("%s called with Ie of length = %zu"), __func__,
ftie->ie_len);
#endif
diff --git a/CORE/HDD/src/wlan_hdd_ftm.c b/CORE/HDD/src/wlan_hdd_ftm.c
index 7bf993d..6c1ab43 100644
--- a/CORE/HDD/src/wlan_hdd_ftm.c
+++ b/CORE/HDD/src/wlan_hdd_ftm.c
@@ -1628,6 +1628,7 @@
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
"%s: Ftm has been started. stopping ftm", __func__);
wlan_ftm_stop(pHddCtx);
+ pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
}
#ifdef WLAN_KD_READY_NOTIFIER
nl_srv_exit(pHddCtx->ptt_pid);
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index aa95229..7117aaa 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -62,6 +62,7 @@
//#include <wlan_qct_driver.h>
#include <wlan_hdd_includes.h>
#include <vos_api.h>
+#include <vos_nvitem.h>
#include <vos_sched.h>
#include <linux/etherdevice.h>
#include <linux/firmware.h>
@@ -3834,6 +3835,12 @@
mem_alloc_failed:
mutex_unlock(&hdd_ctx->cache_channel_lock);
+ /* Disable the channels received in command SET_DISABLE_CHANNEL_LIST*/
+ if (!is_command_repeated) {
+ wlan_hdd_disable_channels(hdd_ctx);
+ hdd_check_and_disconnect_sta_on_invalid_channel(hdd_ctx);
+ }
+
EXIT();
return ret;
@@ -12648,6 +12655,80 @@
}
+/**
+ * hdd_get_feature_caps_cb() - Callback invoked from WDA
+ * @cookie: to identify HDD request to firmware
+ *
+ * This function is invoked from WDA when feature capabilities response
+ * is received from firmware.
+ *
+ * Return: None
+ */
+static void hdd_get_feature_caps_cb(void *cookie)
+{
+ struct hdd_request *request;
+
+ request = hdd_request_get(cookie);
+ if (!request) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("Obsolete request"));
+ return;
+ }
+
+ pr_info("%s: Firmware feature capabilities received\n", __func__);
+
+ hdd_request_complete(request);
+ hdd_request_put(request);
+}
+
+/**
+ * hdd_get_feature_caps() - Get features supported by firmware
+ * @hdd_ctx: Pointer to HDD context
+ *
+ * This function uses request manager framework to get the feature
+ * capabilities from firmware.
+ *
+ * Return: None
+ */
+static void hdd_get_feature_caps(hdd_context_t *hdd_ctx)
+{
+ VOS_STATUS status;
+ void *cookie;
+ int ret;
+ struct hdd_request *request;
+ static const struct hdd_request_params params = {
+ .priv_size = 0,
+ .timeout_ms = WLAN_WAIT_TIME_FEATURE_CAPS,
+ };
+ struct sir_feature_caps_params caps_params = {0};
+
+ request = hdd_request_alloc(¶ms);
+ if (!request) {
+ pr_err("%s: Request allocation failure\n", __func__);
+ return;
+ }
+
+ cookie = hdd_request_cookie(request);
+ caps_params.user_data = cookie;
+ caps_params.feature_caps_cb = hdd_get_feature_caps_cb;
+
+ status = sme_featureCapsExchange(&caps_params);
+ if (status != VOS_STATUS_SUCCESS) {
+ pr_err("%s: Unable to get feature caps\n", __func__);
+ goto end;
+ }
+
+ /* request was sent -- wait for the response */
+ ret = hdd_request_wait_for_response(request);
+ if (ret) {
+ pr_err("%s: SME timeout while retrieving feature caps\n",
+ __func__);
+ goto end;
+ }
+
+end:
+ hdd_request_put(request);
+}
+
/**---------------------------------------------------------------------------
\brief hdd_exchange_version_and_caps() - HDD function to exchange version and capability
@@ -12782,12 +12863,13 @@
sme_disableFeatureCapablity(IBSS_HEARTBEAT_OFFLOAD);
}
- sme_featureCapsExchange(pHddCtx->hHal);
+ hdd_get_feature_caps(pHddCtx);
}
} while (0);
}
+
void wlan_hdd_send_svc_nlink_msg(int type, void *data, int len)
{
struct sk_buff *skb;
@@ -13054,7 +13136,7 @@
}
WLANTL_SetMonRxCbk( pVosContext, hdd_rx_packet_monitor_cbk );
- WDA_featureCapsExchange(pVosContext);
+ sme_featureCapsExchange(NULL);
wcnss_wlan_set_drvdata(pHddCtx->parent_dev, pHddCtx);
pAdapter = hdd_open_adapter( pHddCtx, WLAN_HDD_MONITOR, "wlan%d",
@@ -13379,6 +13461,7 @@
VOS_STATUS status;
hdd_adapter_t *pAdapter = NULL;
hdd_adapter_t *pP2pAdapter = NULL;
+ hdd_adapter_t *softapAdapter = NULL;
hdd_context_t *pHddCtx = NULL;
v_CONTEXT_t pVosContext= NULL;
#ifdef WLAN_BTAMP_FEATURE
@@ -13863,6 +13946,8 @@
goto err_vosstop;
}
+ wlan_hdd_cfg80211_scan_randomization_init(wiphy);
+
#ifndef CONFIG_ENABLE_LINUX_REG
wlan_hdd_cfg80211_update_reg_info( wiphy );
@@ -13893,6 +13978,14 @@
wcnss_wlan_set_drvdata(pHddCtx->parent_dev, pHddCtx);
+#ifdef SAP_AUTH_OFFLOAD
+ if (!sme_IsFeatureSupportedByFW(SAP_OFFLOADS))
+ {
+ hddLog(VOS_TRACE_LEVEL_INFO, FL(" SAP AUTH OFFLOAD not supp by FW"));
+ pHddCtx->cfg_ini->enable_sap_auth_offload = 0;
+ }
+#endif
+
if (VOS_STA_SAP_MODE == hdd_get_conparam())
{
pAdapter = hdd_open_adapter( pHddCtx, WLAN_HDD_SOFTAP, "softap.%d",
@@ -13950,6 +14043,17 @@
goto err_close_adapter;
}
+ if ((strlen(pHddCtx->cfg_ini->enabledefaultSAP) != 0) &&
+ (strcmp(pHddCtx->cfg_ini->enabledefaultSAP, "") != 0)) {
+ softapAdapter = hdd_open_adapter( pHddCtx, WLAN_HDD_SOFTAP,
+ pHddCtx->cfg_ini->enabledefaultSAP,
+ wlan_hdd_get_intf_addr(pHddCtx), FALSE);
+ if (!softapAdapter) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, "%s: hdd_open_adapter failed", __func__);
+ goto err_close_adapter;
+ }
+ }
+
if (country_code)
{
eHalStatus ret;
@@ -14164,25 +14268,15 @@
#endif
-#ifdef SAP_AUTH_OFFLOAD
- if (!sme_IsFeatureSupportedByFW(SAP_OFFLOADS))
- {
- hddLog(VOS_TRACE_LEVEL_INFO, FL(" SAP AUTH OFFLOAD not supp by FW"));
- pHddCtx->cfg_ini->enable_sap_auth_offload = 0;
- }
-#endif
-
if (vos_is_multicast_logging())
wlan_logging_set_log_level();
hdd_register_mcast_bcast_filter(pHddCtx);
- if (VOS_STA_SAP_MODE != hdd_get_conparam())
- {
- /* Action frame registered in one adapter which will
- * applicable to all interfaces
- */
- wlan_hdd_cfg80211_register_frames(pAdapter);
- }
+
+ /* Action frame registered in one adapter which will
+ * applicable to all interfaces
+ */
+ wlan_hdd_cfg80211_register_frames(pAdapter);
mutex_init(&pHddCtx->sap_lock);
mutex_init(&pHddCtx->roc_lock);
@@ -15657,6 +15751,13 @@
{
eHalStatus status;
+ if (init == INIT && init_by_reg_core_user) {
+ init_by_reg_core_user = false;
+ pr_info("driver regulatory hint is not required");
+
+ return VOS_STATUS_SUCCESS;
+ }
+
status = sme_InitChannelsForCC(pHddCtx->hHal, init);
if (HAL_STATUS_SUCCESS(status))
{
diff --git a/CORE/HDD/src/wlan_hdd_scan.c b/CORE/HDD/src/wlan_hdd_scan.c
index ffa4590..cd5037e 100644
--- a/CORE/HDD/src/wlan_hdd_scan.c
+++ b/CORE/HDD/src/wlan_hdd_scan.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -582,7 +582,7 @@
hddLog(LOG1, FL("Processing Spoof request now"));
/* Inform SME about spoof mac addr request*/
if ( eHAL_STATUS_SUCCESS != sme_SpoofMacAddrReq(pHddCtx->hHal,
- &pHddCtx->spoofMacAddr.randomMacAddr))
+ &pHddCtx->spoofMacAddr.randomMacAddr, true))
{
hddLog(LOGE, FL("Sending Spoof request failed - Disable spoofing"));
pHddCtx->spoofMacAddr.isEnabled = FALSE;
diff --git a/CORE/MAC/inc/aniGlobal.h b/CORE/MAC/inc/aniGlobal.h
index 8990091..db919d5 100644
--- a/CORE/MAC/inc/aniGlobal.h
+++ b/CORE/MAC/inc/aniGlobal.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014, 2017-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2014, 2017-2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -379,6 +379,12 @@
tSirMacAddr spoofMacAddr; //added for Mac Addr Spoofing support
tANI_U8 isSpoofingEnabled;
+ /*
+ * @spoof_mac_oui = true when VENDOR_SUBCMD_MAC_OUI is invoked for
+ * mac spoofing.
+ */
+ bool spoof_mac_oui;
+
////////////////////////////////////////// BSS RELATED END ///////////////////////////////////////////
// Place holder for StartBssReq message
// received by SME state machine
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 3161471..4f7e7db 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2017, 2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -913,6 +913,15 @@
/* Number of SSIDs to scan */
tANI_U8 numSsid;
+
+ /*
+ * @nl_scan is set to true if scan request is from cfg80211 sub-system and
+ * known as NL scan.
+ *
+ * @scan_randomize is set to true if NL scan requires randomization.
+ */
+ bool nl_scan;
+ bool scan_randomize;
//channelList has to be the last member of this structure. Check tSirChannelList for the reason.
/* This MUST be the last field of the structure */
@@ -5926,6 +5935,7 @@
tANI_U16 messageType;
tANI_U16 length;
tSirMacAddr macAddr;
+ bool spoof_mac_oui;
} tSirSpoofMacAddrReq, *tpSirSpoofMacAddrReq;
typedef struct
@@ -6427,4 +6437,16 @@
uint8_t switch_count;
};
+typedef void (*sir_feature_caps_cb)(void *user_data);
+
+/**
+ * struct sir_feature_caps_params - Feature capability request
+ * @feature_caps_cb: HDD callback to be invoked from WDA
+ * @user_data: associated user-data with feature_caps_cb callback
+ */
+struct sir_feature_caps_params {
+ sir_feature_caps_cb feature_caps_cb;
+ void *user_data;
+};
+
#endif /* __SIR_API_H */
diff --git a/CORE/MAC/src/cfg/cfgProcMsg.c b/CORE/MAC/src/cfg/cfgProcMsg.c
index 3152327..11207a0 100644
--- a/CORE/MAC/src/cfg/cfgProcMsg.c
+++ b/CORE/MAC/src/cfg/cfgProcMsg.c
@@ -2156,6 +2156,14 @@
PELOGW(cfgLog(pMac, LOGW, FL("CFG hdr totParams %d intParams %d strBufSize %d/%d"),
pHdr->controlSize, pHdr->iBufSize, pHdr->sBufSize, pMac->cfg.gCfgMaxSBufSize);)
+ if (pHdr->sBufSize > (UINT_MAX -
+ (((CFG_PARAM_MAX_NUM + 3 * pMac->cfg.gCfgMaxIBufSize) << 2) +
+ sizeof(tCfgBinHdr)))) {
+ PELOGW(cfgLog(pMac, LOGW, FL("Invalid sBufSize coming from fw %d"),
+ pHdr->sBufSize);)
+ retVal = WNI_CFG_INVALID_LEN;
+ goto end;
+ }
expLen = ((CFG_PARAM_MAX_NUM + 3 * pMac->cfg.gCfgMaxIBufSize) << 2) +
pHdr->sBufSize + sizeof(tCfgBinHdr);
diff --git a/CORE/MAC/src/cfg/cfgUtil/dot11f.frms b/CORE/MAC/src/cfg/cfgUtil/dot11f.frms
index c5f84b3..1ffb2d9 100644
--- a/CORE/MAC/src/cfg/cfgUtil/dot11f.frms
+++ b/CORE/MAC/src/cfg/cfgUtil/dot11f.frms
@@ -2738,7 +2738,7 @@
IE ExtCap (EID_EXT_CAP)
{
- bytes[1..9];
+ bytes[1..15];
}
IE HTCaps (EID_HT_CAPABILITIES)
diff --git a/CORE/MAC/src/include/dot11f.h b/CORE/MAC/src/include/dot11f.h
index 7beb4de..2c2da5c 100644
--- a/CORE/MAC/src/include/dot11f.h
+++ b/CORE/MAC/src/include/dot11f.h
@@ -32,7 +32,7 @@
* \brief Structures, function prototypes & definitions
* for working with 802.11 Frames
* This file was automatically generated by 'framesc'
- * Mon Oct 22 17:30:52 2018 from the following file(s):
+ * Mon Dec 3 16:47:12 2018 from the following file(s):
*
* dot11f.frms
*
@@ -3589,7 +3589,7 @@
typedef struct sDot11fIEExtCap {
tANI_U8 present;
tANI_U8 num_bytes;
- tANI_U8 bytes[9];
+ tANI_U8 bytes[15];
} tDot11fIEExtCap;
#define DOT11F_EID_EXTCAP ( 127 )
@@ -3597,7 +3597,7 @@
// N.B. These #defines do *not* include the EID & length
#define DOT11F_IE_EXTCAP_MIN_LEN ( 1 )
-#define DOT11F_IE_EXTCAP_MAX_LEN ( 9 )
+#define DOT11F_IE_EXTCAP_MAX_LEN ( 15 )
#ifdef __cplusplus
extern "C" {
diff --git a/CORE/MAC/src/include/parserApi.h b/CORE/MAC/src/include/parserApi.h
index b77e10f..9b4fe2f 100644
--- a/CORE/MAC/src/include/parserApi.h
+++ b/CORE/MAC/src/include/parserApi.h
@@ -376,6 +376,7 @@
uint8_t ChanAvailQuery: 1;
uint8_t fineTimingMeas: 1;
uint8_t reserved7: 1;
+ uint8_t fils_capability: 1;
};
tANI_U8
diff --git a/CORE/MAC/src/pe/include/limGlobal.h b/CORE/MAC/src/pe/include/limGlobal.h
index 6b715eb..150184d 100644
--- a/CORE/MAC/src/pe/include/limGlobal.h
+++ b/CORE/MAC/src/pe/include/limGlobal.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2017, 2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -294,6 +294,8 @@
/* Number of SSIDs to scan(send Probe request) */
tANI_U8 numSsid;
+ bool scan_randomize;
+ bool nl_scan;
tANI_BOOLEAN p2pSearch;
tANI_U16 uIEFieldLen;
tANI_U16 uIEFieldOffset;
diff --git a/CORE/MAC/src/pe/lim/limAssocUtils.c b/CORE/MAC/src/pe/lim/limAssocUtils.c
index b3ce7c6..c20c7a6 100644
--- a/CORE/MAC/src/pe/lim/limAssocUtils.c
+++ b/CORE/MAC/src/pe/lim/limAssocUtils.c
@@ -1095,6 +1095,11 @@
vos_mem_free(psessionEntry->parsedAssocReq[pStaDs->assocId]);
psessionEntry->parsedAssocReq[pStaDs->assocId] = NULL;
}
+
+ /* Delete hash entry on add sta failure */
+ limReleasePeerIdx(pMac, pStaDs->assocId, psessionEntry);
+ limDeleteDphHashEntry(pMac, pStaDs->staAddr,
+ pStaDs->assocId,psessionEntry);
}
else
{
diff --git a/CORE/MAC/src/pe/lim/limProcessActionFrame.c b/CORE/MAC/src/pe/lim/limProcessActionFrame.c
index bf364ee..db24aac 100644
--- a/CORE/MAC/src/pe/lim/limProcessActionFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessActionFrame.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2017, 2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -71,7 +71,7 @@
#ifdef WLAN_FEATURE_LFR_MBB
#include "lim_mbb.h"
#endif
-
+#include "dot11f.h"
#define BA_DEFAULT_TX_BUFFER_SIZE 64
@@ -2185,6 +2185,7 @@
tpSirMacMgmtHdr pHdr;
tANI_U8 *pBody;
tANI_U8 transId[2];
+ uint32_t frame_len;
/* Prima --- Below Macro not available in prima
pHdr = SIR_MAC_BD_TO_MPDUHEADER(pBd);
@@ -2192,7 +2193,13 @@
pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
+ frame_len = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
+ if (frame_len < sizeof(struct sDot11fSaQueryReq)) {
+ VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_ERROR,
+ ("Invalid frame length"));
+ return;
+ }
/* If this is an unprotected SA Query Request, then ignore it. */
if (pHdr->fc.wep == 0)
return;
@@ -2241,12 +2248,19 @@
tANI_U16 aid;
tANI_U16 transId;
tANI_U8 retryNum;
+ uint32_t frame_len;
pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
+ frame_len = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO,
("SA Query Response received...")) ;
+ if (frame_len < sizeof(struct sDot11fSaQueryRsp)) {
+ VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_ERROR,
+ ("Invalid frame length"));
+ return;
+ }
/* When a station, supplicant handles SA Query Response.
Forward to SME to HDD to wpa_supplicant. */
if (eLIM_STA_ROLE == psessionEntry->limSystemRole)
diff --git a/CORE/MAC/src/pe/lim/limProcessDeauthFrame.c b/CORE/MAC/src/pe/lim/limProcessDeauthFrame.c
index d4ea763..8554e61 100644
--- a/CORE/MAC/src/pe/lim/limProcessDeauthFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessDeauthFrame.c
@@ -71,15 +71,19 @@
tpDphHashNode pStaDs;
tpPESession pRoamSessionEntry=NULL;
tANI_U8 roamSessionId;
-#ifdef WLAN_FEATURE_11W
tANI_U32 frameLen;
-#endif
-
pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
+ frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
+ if (frameLen < sizeof(reasonCode)) {
+ PELOGE(limLog(pMac, LOGE,
+ FL("received invalid framelen %d"), frameLen);)
+ return;
+ }
+
if ((eLIM_STA_ROLE == psessionEntry->limSystemRole) &&
((eLIM_SME_WT_DISASSOC_STATE == psessionEntry->limSmeState) ||
(eLIM_SME_WT_DEAUTH_STATE == psessionEntry->limSmeState)))
@@ -126,7 +130,6 @@
PELOGE(limLog(pMac, LOGE, FL("received an unprotected deauth from AP"));)
// If the frame received is unprotected, forward it to the supplicant to initiate
// an SA query
- frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
//send the unprotected frame indication to SME
limSendSmeUnprotectedMgmtFrameInd( pMac, pHdr->fc.subType,
diff --git a/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
index 339bc53..b55954a 100644
--- a/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -396,6 +396,43 @@
return;
}
+/**
+ * lim_is_spoofing_needed() - Check whether spoofing is needed for scan
+ * @mac: Pointer to mac
+ *
+ * Return: If spoofing is needed then return true else false.
+ */
+static bool lim_is_spoofing_needed(tpAniSirGlobal mac)
+{
+ /*
+ * If mac spoofing response from firmware is not enabled
+ * then disable spoofing.
+ */
+ if (!mac->lim.isSpoofingEnabled)
+ return false;
+
+ /*
+ * If all the octets of spoof mac-address are zero
+ * then disable spoofing.
+ */
+ if (vos_is_macaddr_zero((v_MACADDR_t *)&mac->lim.spoofMacAddr))
+ return false;
+
+ /*
+ * If disableP2PMacSpoof is enabled and scan is P2P scan
+ * then disable spoofing.
+ */
+ if (mac->roam.configParam.disableP2PMacSpoofing &&
+ mac->lim.gpLimMlmScanReq->p2pSearch)
+ return false;
+
+ /* Randomize NL (cfg80211) scan only when scan_randomize is set */
+ if (mac->lim.gpLimMlmScanReq->nl_scan)
+ return mac->lim.gpLimMlmScanReq->scan_randomize;
+
+ /* Randomize all other scans only when spoof_mac_oui is set */
+ return mac->lim.spoof_mac_oui;
+}
/**
* limContinuePostChannelScan()
@@ -456,23 +493,16 @@
*/
do
{
- tSirMacAddr gSelfMacAddr;
+ tSirMacAddr gSelfMacAddr;
+ bool spoof = lim_is_spoofing_needed(pMac);
- /* Send self MAC as src address if
- * MAC spoof is not enabled OR
- * spoofMacAddr is all 0 OR
- * disableP2PMacSpoof is enabled and scan is P2P scan
- * else use the spoofMac as src address
- */
- if ((pMac->lim.isSpoofingEnabled != TRUE) ||
- (TRUE ==
- vos_is_macaddr_zero((v_MACADDR_t *)&pMac->lim.spoofMacAddr)) ||
- (pMac->roam.configParam.disableP2PMacSpoofing &&
- pMac->lim.gpLimMlmScanReq->p2pSearch)) {
- vos_mem_copy(gSelfMacAddr, pMac->lim.gSelfMacAddr, VOS_MAC_ADDRESS_LEN);
- } else {
- vos_mem_copy(gSelfMacAddr, pMac->lim.spoofMacAddr, VOS_MAC_ADDRESS_LEN);
- }
+ if (spoof)
+ vos_mem_copy(gSelfMacAddr, pMac->lim.spoofMacAddr,
+ VOS_MAC_ADDRESS_LEN);
+ else
+ vos_mem_copy(gSelfMacAddr, pMac->lim.gSelfMacAddr,
+ VOS_MAC_ADDRESS_LEN);
+
limLog(pMac, LOG1,
FL(" Mac Addr "MAC_ADDRESS_STR " used in sending ProbeReq number %d, for SSID %s on channel: %d"),
MAC_ADDR_ARRAY(gSelfMacAddr) ,i, pMac->lim.gpLimMlmScanReq->ssId[i].ssId, channelNum);
@@ -1763,7 +1793,7 @@
pAddBssParams->rateSet.numRates = SIR_MAC_RATESET_EID_MAX;
}
vos_mem_copy(pAddBssParams->rateSet.rate,
- pMlmStartReq->rateSet.rate, pMlmStartReq->rateSet.numRates);
+ pMlmStartReq->rateSet.rate, pAddBssParams->rateSet.numRates);
pAddBssParams->nwType = pMlmStartReq->nwType;
@@ -1798,7 +1828,7 @@
}
vos_mem_copy(pAddBssParams->ssId.ssId,
pMlmStartReq->ssId.ssId,
- pMlmStartReq->ssId.length);
+ pAddBssParams->ssId.length);
pAddBssParams->bHiddenSSIDEn = pMlmStartReq->ssidHidden;
limLog( pMac, LOGE, FL( "TRYING TO HIDE SSID %d" ),pAddBssParams->bHiddenSSIDEn);
@@ -4239,23 +4269,16 @@
*/
do
{
- tSirMacAddr gSelfMacAddr;
+ tSirMacAddr gSelfMacAddr;
+ bool spoof = lim_is_spoofing_needed(pMac);
- /* Send self MAC as src address if
- * MAC spoof is not enabled OR
- * spoofMacAddr is all 0 OR
- * disableP2PMacSpoof is enabled and scan is P2P scan
- * else use the spoofMac as src address
- */
- if ((pMac->lim.isSpoofingEnabled != TRUE) ||
- (TRUE ==
- vos_is_macaddr_zero((v_MACADDR_t *)&pMac->lim.spoofMacAddr)) ||
- (pMac->roam.configParam.disableP2PMacSpoofing &&
- pMac->lim.gpLimMlmScanReq->p2pSearch)) {
- vos_mem_copy(gSelfMacAddr, pMac->lim.gSelfMacAddr, VOS_MAC_ADDRESS_LEN);
- } else {
- vos_mem_copy(gSelfMacAddr, pMac->lim.spoofMacAddr, VOS_MAC_ADDRESS_LEN);
- }
+ if (spoof)
+ vos_mem_copy(gSelfMacAddr, pMac->lim.spoofMacAddr,
+ VOS_MAC_ADDRESS_LEN);
+ else
+ vos_mem_copy(gSelfMacAddr, pMac->lim.gSelfMacAddr,
+ VOS_MAC_ADDRESS_LEN);
+
limLog( pMac, LOG1, FL("Mac Addr used in Probe Req is :"MAC_ADDRESS_STR),
MAC_ADDR_ARRAY(gSelfMacAddr));
diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
index d3925fc..b224b6a 100644
--- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -1541,6 +1541,8 @@
pScanReq->max_chntime_btc_esco;
pMlmScanReq->dot11mode = pScanReq->dot11mode;
pMlmScanReq->p2pSearch = pScanReq->p2pSearch;
+ pMlmScanReq->scan_randomize = pScanReq->scan_randomize;
+ pMlmScanReq->nl_scan = pScanReq->nl_scan;
//Store the smeSessionID and transaction ID for later use.
pMac->lim.gSmeSessionId = pScanReq->sessionId;
@@ -2643,6 +2645,16 @@
case eLIM_BT_AMP_STA_ROLE:
switch (psessionEntry->limSmeState)
{
+ /* cleanup FT session and proceed with disconnect
+ * if received disconnect from supplicant when roaming
+ * and lim state is eLIM_SME_WT_REASSOC_STATE. As the
+ * FT session would have already created but is not cleaned.
+ * This will prevent sending duplicate add bss request,
+ * if we try to disconnect and connect to the same AP
+ */
+ case eLIM_SME_WT_REASSOC_STATE:
+ limFTCleanup(pMac);
+ /* Fall through */
case eLIM_SME_ASSOCIATED_STATE:
case eLIM_SME_LINK_EST_STATE:
limLog(pMac, LOG1, FL("Rcvd SME_DISASSOC_REQ while in "
@@ -5592,6 +5604,8 @@
vos_mem_copy(pMac->lim.spoofMacAddr, pSmeReq->macAddr, VOS_MAC_ADDRESS_LEN);
+ pMac->lim.spoof_mac_oui = pSmeReq->spoof_mac_oui;
+
limLog( pMac, LOG1, FL("Recieved Spoofed Mac Addr request with Addr:"
MAC_ADDRESS_STR), MAC_ADDR_ARRAY(pMac->lim.spoofMacAddr) );
@@ -5664,7 +5678,7 @@
switch_count = session_entry->gLimChannelSwitch.switchCount;
dph_node_array_ptr = session_entry->dph.dphHashTable.pDphNodeArray;
- for (i = 0; i < (mac_ctx->lim.maxStation + 1); i++) {
+ for (i = 0; i < session_entry->dph.dphHashTable.size; i++) {
psta = dph_node_array_ptr + i;
if (!(psta && psta->added))
continue;
diff --git a/CORE/MAC/src/pe/lim/limProcessTdls.c b/CORE/MAC/src/pe/lim/limProcessTdls.c
index 0fd0050..9bed290 100644
--- a/CORE/MAC/src/pe/lim/limProcessTdls.c
+++ b/CORE/MAC/src/pe/lim/limProcessTdls.c
@@ -3565,6 +3565,44 @@
return offset;
}
+offset_t lim_get_channel_width_from_opclass(tANI_U8 *country, tANI_U8 channel,
+ tANI_U8 peer_vht_capable,
+ tANI_U8 op_class)
+{
+ op_class_map_t *class;
+ tANI_U16 i = 0;
+ offset_t offset, max_allowed;
+
+ if (peer_vht_capable &&
+ IS_FEATURE_SUPPORTED_BY_FW(DOT11AC) &&
+ IS_FEATURE_SUPPORTED_BY_DRIVER(DOT11AC))
+ max_allowed = BW80;
+ else
+ max_allowed = BW40MINUS;
+
+ if (vos_mem_compare(country,"US", 2))
+ class = us_op_class;
+ else if (vos_mem_compare(country,"EU", 2))
+ class = euro_op_class;
+ else if (vos_mem_compare(country,"JP", 2))
+ class = japan_op_class;
+ else
+ class = global_op_class;
+
+ while (class->op_class) {
+ if (op_class == class->op_class) {
+ for (i = 0; (i < 25 && class->channels[i]); i++) {
+ if (channel == class->channels[i]) {
+ offset = class->offset;
+ return (offset <= max_allowed) ? offset: BW20;
+ }
+ }
+ }
+ class++;
+ }
+
+ return BW20;
+}
tANI_U8 limGetOPClassFromChannel(tANI_U8 *country,
tANI_U8 channel,
diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c
index 547caff..e0f4560 100644
--- a/CORE/MAC/src/pe/lim/limUtils.c
+++ b/CORE/MAC/src/pe/lim/limUtils.c
@@ -2967,10 +2967,11 @@
session->gLimChannelSwitch.secondarySubBand = PHY_SINGLE_CHANNEL_CENTERED;
session->gLimWiderBWChannelSwitch.newChanWidth = 0;
- ch_offset = limGetOffChMaxBwOffsetFromChannel(
- mac_ctx->scan.countryCodeCurrent,
- ecsa_req->new_channel,
- sta_ds->mlmStaContext.vhtCapability);
+ ch_offset =
+ lim_get_channel_width_from_opclass(mac_ctx->scan.countryCodeCurrent,
+ ecsa_req->new_channel,
+ sta_ds->mlmStaContext.vhtCapability,
+ ecsa_req->op_class);
if (ch_offset == BW80) {
session->gLimWiderBWChannelSwitch.newChanWidth =
WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ;
diff --git a/CORE/MAC/src/pe/lim/limUtils.h b/CORE/MAC/src/pe/lim/limUtils.h
index 5801f52..ed1f17a 100644
--- a/CORE/MAC/src/pe/lim/limUtils.h
+++ b/CORE/MAC/src/pe/lim/limUtils.h
@@ -572,9 +572,19 @@
tANI_U8 limGetOPClassFromChannel(tANI_U8 *country,
tANI_U8 channel,
tANI_U8 offset);
-tANI_U8 limGetOffChMaxBwOffsetFromChannel(tANI_U8 *country,
- tANI_U8 channel,
- tANI_U8 peerVHTCapability);
+
+/**
+ * lim_get_channel_width_from_opclass() - get the channel offset for the opclass
+ * @country: current country code
+ * @channel: channel for which width is required
+ * @peer_vht_capable: if peer is VHT capable
+ * @op_class: Opclass provided
+ *
+ * Return: channel offset for the opclass
+ */
+offset_t lim_get_channel_width_from_opclass(tANI_U8 *country, tANI_U8 channel,
+ tANI_U8 peer_vht_capable,
+ tANI_U8 op_class);
void limParseBeaconForTim(tpAniSirGlobal pMac, tANI_U8* pRxPacketInfo,
tpPESession psessionEntry);
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index ee17116..59eb8eb 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -296,6 +296,8 @@
tANI_U32 restTime; //in units of milliseconds //ignored when not connected
tANI_U32 uIEFieldLen;
tANI_U8 *pIEField;
+ bool scan_randomize;
+ bool nl_scan;
eCsrRequestType requestType; //11d scan or full scan
tANI_BOOLEAN p2pSearch;
tANI_BOOLEAN skipDfsChnlInP2pSearch;
diff --git a/CORE/SME/inc/csrInternal.h b/CORE/SME/inc/csrInternal.h
index 77edd48..8a7a8e8 100644
--- a/CORE/SME/inc/csrInternal.h
+++ b/CORE/SME/inc/csrInternal.h
@@ -1238,6 +1238,7 @@
tANI_BOOLEAN csrIsAnySessionInConnectState( tpAniSirGlobal pMac );
tANI_BOOLEAN csrIsAllSessionDisconnected( tpAniSirGlobal pMac );
tANI_BOOLEAN csrIsStaSessionConnected( tpAniSirGlobal pMac );
+tANI_BOOLEAN csrIsP2pGoSessionConnected( tpAniSirGlobal pMac );
tANI_BOOLEAN csrIsP2pSessionConnected( tpAniSirGlobal pMac );
tANI_BOOLEAN csrIsAnySessionConnected( tpAniSirGlobal pMac );
tANI_BOOLEAN csrIsInfraConnected( tpAniSirGlobal pMac );
diff --git a/CORE/SME/inc/csrNeighborRoam.h b/CORE/SME/inc/csrNeighborRoam.h
index 93bfc07..5a07210 100644
--- a/CORE/SME/inc/csrNeighborRoam.h
+++ b/CORE/SME/inc/csrNeighborRoam.h
@@ -275,7 +275,14 @@
tSirMacAddr bssId);
void csrNeighborRoamFreeNeighborRoamBSSNode(tpAniSirGlobal pMac,
tpCsrNeighborRoamBSSInfo neighborRoamBSSNode);
-
+/**
+ * csrRemoveNeighbourRoamPreauthCommand() - Remove any pending preauth
+ * command
+ * @pMac: Mac handle
+ *
+ * Return: None
+ */
+void csrRemoveNeighbourRoamPreauthCommand(tpAniSirGlobal pMac);
#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
#define ROAM_SCAN_OFFLOAD_START 1
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 658c17a..51c9425 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -324,13 +324,16 @@
void *callbackContext);
#endif
-/* ---------------------------------------------------------------------------
- \fn sme_SpoofMacAddrReq
- \brief SME API to send Spoof Mac Addr req to HAL
- \param macaddr: mac address to be sent
- \- return eHalStatus
- -------------------------------------------------------------------------*/
-eHalStatus sme_SpoofMacAddrReq(tHalHandle hHal, v_MACADDR_t *macaddr);
+/**
+ * sme_SpoofMacAddrReq() - SME API to send Spoof Mac Addr req to HAL
+ * @hHal: Hal handle
+ * @macaddr: Spoof mac address to be sent
+ * @spoof_mac_oui: If spoof request is from VENDOR_SUBCMD_MAC_OUI
+ *
+ * Return: eHalStatus
+ */
+eHalStatus
+sme_SpoofMacAddrReq(tHalHandle hHal, v_MACADDR_t *macaddr, bool spoof_mac_oui);
typedef enum
{
@@ -2805,17 +2808,17 @@
---------------------------------------------------------------------------*/
eHalStatus sme_SetTmLevel(tHalHandle hHal, v_U16_t newTMLevel, v_U16_t tmMode);
-/*---------------------------------------------------------------------------
-
- \brief sme_featureCapsExchange() - SME interface to exchange capabilities between
- Host and FW.
-
- \param hHal - HAL handle for device
-
- \return NONE
-
----------------------------------------------------------------------------*/
-void sme_featureCapsExchange(tHalHandle hHal);
+/**
+ * sme_featureCapsExchange() - SME API to get firmware feature caps
+ * @params: Pointer to hold HDD callback to be invoked for response
+ * and associated user data.
+ *
+ * This function is used to exchange capabilities between Host and FW.
+ *
+ * Return: VOS_STATUS
+ */
+VOS_STATUS
+sme_featureCapsExchange(struct sir_feature_caps_params *params);
/*---------------------------------------------------------------------------
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index 604f7ad..058915b 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -10253,6 +10253,9 @@
#ifndef WLAN_MDM_CODE_REDUCTION_OPT
sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
#endif
+#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
+ csrRemoveNeighbourRoamPreauthCommand(pMac);
+#endif
csrRoamLinkDown(pMac, sessionId);
csrRoamIssueWmStatusChange( pMac, sessionId, eCsrDeauthenticated, pSirMsg );
}
diff --git a/CORE/SME/src/csr/csrApiScan.c b/CORE/SME/src/csr/csrApiScan.c
index 4fe6095..901e2da 100644
--- a/CORE/SME/src/csr/csrApiScan.c
+++ b/CORE/SME/src/csr/csrApiScan.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -392,7 +392,7 @@
* candidates and resulting in disconnects.
*/
- if (csrIsInfraApStarted(pMac))
+ if (csrIsInfraApStarted(pMac) && !csrIsP2pGoSessionConnected(pMac))
{
nNumChanCombinedConc = 1;
}
@@ -6452,6 +6452,8 @@
pScanReq->uIEFieldLen);
}
pMsg->p2pSearch = pScanReq->p2pSearch;
+ pMsg->scan_randomize= pScanReq->scan_randomize;
+ pMsg->nl_scan = pScanReq->nl_scan;
if (pScanReq->requestType == eCSR_SCAN_HO_BG_SCAN)
{
@@ -6666,6 +6668,9 @@
// spoof mac address
vos_mem_copy((tANI_U8 *)pMsg->macAddr,
(tANI_U8 *)pCommand->u.macAddrSpoofCmd.macAddr, sizeof(tSirMacAddr));
+ pMsg->spoof_mac_oui =
+ pal_cpu_to_be16(pCommand->u.macAddrSpoofCmd.spoof_mac_oui);
+
status = palSendMBMessage(pMac->hHdd, pMsg);
} while( 0 );
return( status );
@@ -7145,6 +7150,8 @@
break;
}
}//Allocate memory for SSID List
+ pDstReq->scan_randomize = pSrcReq->scan_randomize;
+ pDstReq->nl_scan = pSrcReq->nl_scan;
pDstReq->p2pSearch = pSrcReq->p2pSearch;
pDstReq->skipDfsChnlInP2pSearch = pSrcReq->skipDfsChnlInP2pSearch;
@@ -7303,7 +7310,7 @@
* candidates and resulting in disconnects.
*/
- if (csrIsInfraApStarted(pMac))
+ if (csrIsInfraApStarted(pMac) && !csrIsP2pGoSessionConnected(pMac))
{
nNumChanCombinedConc = 1;
}
diff --git a/CORE/SME/src/csr/csrNeighborRoam.c b/CORE/SME/src/csr/csrNeighborRoam.c
index 5fa6ab9..229ed17 100644
--- a/CORE/SME/src/csr/csrNeighborRoam.c
+++ b/CORE/SME/src/csr/csrNeighborRoam.c
@@ -5378,6 +5378,50 @@
#endif
return (val);
}
+
+void csrRemoveNeighbourRoamPreauthCommand(tpAniSirGlobal pMac)
+{
+ tListElem *entry;
+ tSmeCmd *command;
+
+ entry = csrLLPeekHead(&pMac->sme.smeCmdPendingList, LL_ACCESS_LOCK);
+ while (entry)
+ {
+ command = GET_BASE_ADDR(entry, tSmeCmd, Link);
+ if ((eSmeCommandRoam == command->command) &&
+ (eCsrPerformPreauth == command->u.roamCmd.roamReason))
+ {
+ if (csrLLRemoveEntry(&pMac->sme.smeCmdPendingList, entry,
+ LL_ACCESS_LOCK)) {
+ csrReleaseCommandPreauth(pMac, command);
+ CSR_NEIGHBOR_ROAM_STATE_TRANSITION(
+ eCSR_NEIGHBOR_ROAM_STATE_CONNECTED);
+ break;
+ }
+ }
+ entry = csrLLNext(&pMac->sme.smeCmdPendingList, entry, LL_ACCESS_LOCK);
+ }
+
+ entry = csrLLPeekHead(&pMac->roam.roamCmdPendingList, LL_ACCESS_LOCK);
+ while (entry)
+ {
+ command = GET_BASE_ADDR(entry, tSmeCmd, Link);
+ if ((eSmeCommandRoam == command->command) &&
+ (eCsrPerformPreauth == command->u.roamCmd.roamReason))
+ {
+ if (csrLLRemoveEntry(&pMac->roam.roamCmdPendingList, entry,
+ LL_ACCESS_LOCK)) {
+ csrReleaseCommandPreauth(pMac, command);
+ CSR_NEIGHBOR_ROAM_STATE_TRANSITION(
+ eCSR_NEIGHBOR_ROAM_STATE_CONNECTED);
+ break;
+ }
+ }
+ entry = csrLLNext(&pMac->roam.roamCmdPendingList, entry,
+ LL_ACCESS_LOCK);
+ }
+}
+
#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
/* ---------------------------------------------------------------------------
diff --git a/CORE/SME/src/csr/csrUtil.c b/CORE/SME/src/csr/csrUtil.c
index 916caff..3d23fa5 100644
--- a/CORE/SME/src/csr/csrUtil.c
+++ b/CORE/SME/src/csr/csrUtil.c
@@ -1585,6 +1585,31 @@
return( fRc );
}
+tANI_BOOLEAN csrIsP2pGoSessionConnected( tpAniSirGlobal pMac )
+{
+ tANI_U32 i;
+ tCsrRoamSession *pSession = NULL;
+
+ for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
+ {
+ if(CSR_IS_SESSION_VALID( pMac, i) &&
+ !csrIsConnStateDisconnected(pMac, i))
+ {
+ pSession = CSR_GET_SESSION(pMac, i);
+
+ if (NULL != pSession->pCurRoamProfile)
+ {
+ if (pSession->pCurRoamProfile->csrPersona == VOS_P2P_GO_MODE) {
+ return eANI_BOOLEAN_TRUE;
+ }
+ }
+ }
+ }
+
+ return eANI_BOOLEAN_FALSE;
+}
+
+
tANI_BOOLEAN csrIsP2pSessionConnected( tpAniSirGlobal pMac )
{
tANI_U32 i;
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 7bc6f3c..7b19327 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -2761,6 +2761,7 @@
vos_msg_t vosMessage = {0};
tANI_U32 session_id = 0;
bool active_scan;
+ tANI_U32 nTime = 0;
if (pSmeCoexInd->coexIndType == SIR_COEX_IND_TYPE_DISABLE_AGGREGATION_IN_2p4)
{
@@ -2788,6 +2789,11 @@
pMac->scan.fRestartIdleScan = eANI_BOOLEAN_TRUE;
pMac->scan.fCancelIdleScan = eANI_BOOLEAN_FALSE;
+ if(csrIsAllSessionDisconnected(pMac) &&
+ !HAL_STATUS_SUCCESS(csrScanTriggerIdleScan(pMac,
+ &nTime))) {
+ csrScanStartIdleScanTimer(pMac, nTime);
+ }
/*
* If aggregation during SCO is enabled, there is a
* possibility for an active BA session. This session
@@ -10159,22 +10165,19 @@
return(status);
}
-/*---------------------------------------------------------------------------
-
- \brief sme_featureCapsExchange() - SME interface to exchange capabilities between
- Host and FW.
-
- \param hHal - HAL handle for device
-
- \return NONE
-
----------------------------------------------------------------------------*/
-void sme_featureCapsExchange( tHalHandle hHal)
+VOS_STATUS
+sme_featureCapsExchange(struct sir_feature_caps_params *params)
{
- v_CONTEXT_t vosContext = vos_get_global_context(VOS_MODULE_ID_SME, NULL);
- MTRACE(vos_trace(VOS_MODULE_ID_SME,
- TRACE_CODE_SME_RX_HDD_CAPS_EXCH, NO_SESSION, 0));
- WDA_featureCapsExchange(vosContext);
+ VOS_STATUS status;
+ v_CONTEXT_t vosContext = vos_get_global_context(VOS_MODULE_ID_SME,
+ NULL);
+
+ MTRACE(vos_trace(VOS_MODULE_ID_SME,
+ TRACE_CODE_SME_RX_HDD_CAPS_EXCH, NO_SESSION, 0));
+
+ status = WDA_featureCapsExchange(vosContext, params);
+
+ return status;
}
/*---------------------------------------------------------------------------
@@ -13286,7 +13289,8 @@
}
}
-eHalStatus sme_SpoofMacAddrReq(tHalHandle hHal, v_MACADDR_t *macaddr)
+eHalStatus
+sme_SpoofMacAddrReq(tHalHandle hHal, v_MACADDR_t *macaddr, bool spoof_mac_oui)
{
tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
eHalStatus status = eHAL_STATUS_SUCCESS;
@@ -13304,6 +13308,8 @@
vos_mem_copy(pMacSpoofCmd->u.macAddrSpoofCmd.macAddr,
macaddr->bytes, VOS_MAC_ADDRESS_LEN);
+ pMacSpoofCmd->u.macAddrSpoofCmd.spoof_mac_oui = spoof_mac_oui;
+
status = csrQueueSmeCommand(pMac, pMacSpoofCmd, false);
if ( !HAL_STATUS_SUCCESS( status ) )
{
diff --git a/CORE/SME/src/sme_common/sme_FTApi.c b/CORE/SME/src/sme_common/sme_FTApi.c
index c601d53..e6776c9 100644
--- a/CORE/SME/src/sme_common/sme_FTApi.c
+++ b/CORE/SME/src/sme_common/sme_FTApi.c
@@ -128,7 +128,7 @@
}
#if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
- smsLog( pMac, LOGE, "FT IEs Req is received in state %d",
+ smsLog( pMac, LOG1, "FT IEs Req is received in state %d",
pMac->ft.ftSmeContext.FTState);
#endif
@@ -173,10 +173,10 @@
// Delete the pre-auth node locally. Set your self back to restart pre-auth
// TBD
#if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
- smsLog( pMac, LOGE,
+ smsLog( pMac, LOG1,
"Pre-auth done and now receiving---> AUTH REQ <---- in state %d",
pMac->ft.ftSmeContext.FTState);
- smsLog( pMac, LOGE, "Unhandled reception of FT IES in state %d",
+ smsLog( pMac, LOG1, "Unhandled reception of FT IES in state %d",
pMac->ft.ftSmeContext.FTState);
#endif
break;
@@ -187,7 +187,7 @@
// At this juncture we are ready to start sending Re-Assoc Req.
#if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
- smsLog( pMac, LOGE, "New Reassoc Req=%pK in state %d",
+ smsLog( pMac, LOG1, "New Reassoc Req=%pK in state %d",
ft_ies, pMac->ft.ftSmeContext.FTState);
#endif
if ((pMac->ft.ftSmeContext.reassoc_ft_ies) &&
@@ -413,7 +413,7 @@
pMac->ft.ftSmeContext.FTState = eFT_REASSOC_REQ_WAIT;
#ifdef WLAN_FEATURE_VOWIFI_11R_DEBUG
- smsLog( pMac, LOGE, FL(" Filled auth resp = %d"), *ft_ies_length);
+ smsLog( pMac, LOG1, FL(" Filled auth resp = %d"), *ft_ies_length);
#endif
sme_ReleaseGlobalLock( &pMac->sme );
return;
@@ -452,7 +452,7 @@
*ric_ies_length = pMac->ft.ftSmeContext.psavedFTPreAuthRsp->ric_ies_length;
#ifdef WLAN_FEATURE_VOWIFI_11R_DEBUG
- smsLog( pMac, LOGE, FL(" Filled ric ies = %d"), *ric_ies_length);
+ smsLog( pMac, LOG1, FL(" Filled ric ies = %d"), *ric_ies_length);
#endif
sme_ReleaseGlobalLock( &pMac->sme );
diff --git a/CORE/SYS/legacy/src/utils/src/dot11f.c b/CORE/SYS/legacy/src/utils/src/dot11f.c
index 90af7d2..50e1df2 100644
--- a/CORE/SYS/legacy/src/utils/src/dot11f.c
+++ b/CORE/SYS/legacy/src/utils/src/dot11f.c
@@ -30,7 +30,7 @@
* \brief Structures, functions & definitions for
* working with 802.11 Frames
* This file was automatically generated by 'framesc'
- * Mon Oct 22 17:30:52 2018 from the following file(s):
+ * Mon Dec 3 16:47:12 2018 from the following file(s):
*
* dot11f.frms
*
@@ -4332,7 +4332,7 @@
if (!ielen) /* Check to ensure copying of ielen bytes */
goto endUnpackIeExtCap;
pDst->num_bytes = (tANI_U8)( ielen );
- if (ielen > 9){
+ if (ielen > 15){
pDst->present = 0;
return DOT11F_SKIPPED_BAD_IE;
}
@@ -8542,7 +8542,7 @@
{offsetof(tDot11fAssocRequest, P2PIEOpaque), offsetof(tDot11fIEP2PIEOpaque, present), 0, "P2PIEOpaque" , 0, 8, 255, SigIeP2PIEOpaque, {80, 111, 154, 9, 0}, 4, DOT11F_EID_P2PIEOPAQUE, 0, 0, },
{offsetof(tDot11fAssocRequest, WFDIEOpaque), offsetof(tDot11fIEWFDIEOpaque, present), 0, "WFDIEOpaque" , 0, 8, 255, SigIeWFDIEOpaque, {80, 111, 154, 10, 0}, 4, DOT11F_EID_WFDIEOPAQUE, 0, 0, },
{offsetof(tDot11fAssocRequest, VHTCaps), offsetof(tDot11fIEVHTCaps, present), 0, "VHTCaps" , 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTCAPS, 0, 0, },
- {offsetof(tDot11fAssocRequest, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 11, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
+ {offsetof(tDot11fAssocRequest, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 17, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
{offsetof(tDot11fAssocRequest, OperatingMode), offsetof(tDot11fIEOperatingMode, present), 0, "OperatingMode" , 0, 3, 3, SigIeOperatingMode, {0, 0, 0, 0, 0}, 0, DOT11F_EID_OPERATINGMODE, 0, 0, },
{offsetof(tDot11fAssocRequest, QosMapSet), offsetof(tDot11fIEQosMapSet, present), 0, "QosMapSet" , 0, 2, 62, SigIeQosMapSet, {0, 0, 0, 0, 0}, 0, DOT11F_EID_QOSMAPSET, 0, 0, },
{offsetof(tDot11fAssocRequest, hs20vendor_ie), offsetof(tDot11fIEhs20vendor_ie, present), 0, "hs20vendor_ie" , 0, 7, 9, SigIehs20vendor_ie, {80, 111, 154, 16, 0}, 4, DOT11F_EID_HS20VENDOR_IE, 0, 0, },
@@ -9197,7 +9197,7 @@
{offsetof(tDot11fAssocResponse, P2PAssocRes), offsetof(tDot11fIEP2PAssocRes, present), 0, "P2PAssocRes" , 0, 6, 17, SigIeP2PAssocRes, {80, 111, 154, 9, 0}, 4, DOT11F_EID_P2PASSOCRES, 0, 0, },
{offsetof(tDot11fAssocResponse, VHTCaps), offsetof(tDot11fIEVHTCaps, present), 0, "VHTCaps" , 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTCAPS, 0, 0, },
{offsetof(tDot11fAssocResponse, VHTOperation), offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation" , 0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTOPERATION, 0, 0, },
- {offsetof(tDot11fAssocResponse, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 11, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
+ {offsetof(tDot11fAssocResponse, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 17, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
{offsetof(tDot11fAssocResponse, OBSSScanParameters), offsetof(tDot11fIEOBSSScanParameters, present), 0, "OBSSScanParameters" , 0, 16, 16, SigIeOBSSScanParameters, {0, 0, 0, 0, 0}, 0, DOT11F_EID_OBSSSCANPARAMETERS, 0, 0, },
{offsetof(tDot11fAssocResponse, QosMapSet), offsetof(tDot11fIEQosMapSet, present), 0, "QosMapSet" , 0, 2, 62, SigIeQosMapSet, {0, 0, 0, 0, 0}, 0, DOT11F_EID_QOSMAPSET, 0, 0, },
{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, }, };
@@ -10768,7 +10768,7 @@
{offsetof(tDot11fBeacon, VHTCaps), offsetof(tDot11fIEVHTCaps, present), 0, "VHTCaps" , 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTCAPS, 0, 0, },
{offsetof(tDot11fBeacon, VHTOperation), offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation" , 0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTOPERATION, 0, 0, },
{offsetof(tDot11fBeacon, VHTExtBssLoad), offsetof(tDot11fIEVHTExtBssLoad, present), 0, "VHTExtBssLoad" , 0, 7, 7, SigIeVHTExtBssLoad, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTEXTBSSLOAD, 0, 0, },
- {offsetof(tDot11fBeacon, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 11, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
+ {offsetof(tDot11fBeacon, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 17, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
{offsetof(tDot11fBeacon, OperatingMode), offsetof(tDot11fIEOperatingMode, present), 0, "OperatingMode" , 0, 3, 3, SigIeOperatingMode, {0, 0, 0, 0, 0}, 0, DOT11F_EID_OPERATINGMODE, 0, 0, },
{offsetof(tDot11fBeacon, WiderBWChanSwitchAnn), offsetof(tDot11fIEWiderBWChanSwitchAnn, present), 0, "WiderBWChanSwitchAnn" , 0, 5, 5, SigIeWiderBWChanSwitchAnn, {0, 0, 0, 0, 0}, 0, DOT11F_EID_WIDERBWCHANSWITCHANN, 0, 0, },
{offsetof(tDot11fBeacon, OBSSScanParameters), offsetof(tDot11fIEOBSSScanParameters, present), 0, "OBSSScanParameters" , 0, 16, 16, SigIeOBSSScanParameters, {0, 0, 0, 0, 0}, 0, DOT11F_EID_OBSSSCANPARAMETERS, 0, 0, },
@@ -11989,7 +11989,7 @@
{offsetof(tDot11fBeacon2, VHTCaps), offsetof(tDot11fIEVHTCaps, present), 0, "VHTCaps" , 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTCAPS, 0, 0, },
{offsetof(tDot11fBeacon2, VHTOperation), offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation" , 0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTOPERATION, 0, 0, },
{offsetof(tDot11fBeacon2, VHTExtBssLoad), offsetof(tDot11fIEVHTExtBssLoad, present), 0, "VHTExtBssLoad" , 0, 7, 7, SigIeVHTExtBssLoad, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTEXTBSSLOAD, 0, 0, },
- {offsetof(tDot11fBeacon2, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 11, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
+ {offsetof(tDot11fBeacon2, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 17, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
{offsetof(tDot11fBeacon2, OperatingMode), offsetof(tDot11fIEOperatingMode, present), 0, "OperatingMode" , 0, 3, 3, SigIeOperatingMode, {0, 0, 0, 0, 0}, 0, DOT11F_EID_OPERATINGMODE, 0, 0, },
{offsetof(tDot11fBeacon2, WiderBWChanSwitchAnn), offsetof(tDot11fIEWiderBWChanSwitchAnn, present), 0, "WiderBWChanSwitchAnn" , 0, 5, 5, SigIeWiderBWChanSwitchAnn, {0, 0, 0, 0, 0}, 0, DOT11F_EID_WIDERBWCHANSWITCHANN, 0, 0, },
{offsetof(tDot11fBeacon2, OBSSScanParameters), offsetof(tDot11fIEOBSSScanParameters, present), 0, "OBSSScanParameters" , 0, 16, 16, SigIeOBSSScanParameters, {0, 0, 0, 0, 0}, 0, DOT11F_EID_OBSSSCANPARAMETERS, 0, 0, },
@@ -12978,7 +12978,7 @@
{offsetof(tDot11fBeaconIEs, VHTCaps), offsetof(tDot11fIEVHTCaps, present), 0, "VHTCaps" , 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTCAPS, 0, 0, },
{offsetof(tDot11fBeaconIEs, VHTOperation), offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation" , 0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTOPERATION, 0, 0, },
{offsetof(tDot11fBeaconIEs, VHTExtBssLoad), offsetof(tDot11fIEVHTExtBssLoad, present), 0, "VHTExtBssLoad" , 0, 7, 7, SigIeVHTExtBssLoad, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTEXTBSSLOAD, 0, 0, },
- {offsetof(tDot11fBeaconIEs, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 11, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
+ {offsetof(tDot11fBeaconIEs, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 17, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
{offsetof(tDot11fBeaconIEs, OperatingMode), offsetof(tDot11fIEOperatingMode, present), 0, "OperatingMode" , 0, 3, 3, SigIeOperatingMode, {0, 0, 0, 0, 0}, 0, DOT11F_EID_OPERATINGMODE, 0, 0, },
{offsetof(tDot11fBeaconIEs, WiderBWChanSwitchAnn), offsetof(tDot11fIEWiderBWChanSwitchAnn, present), 0, "WiderBWChanSwitchAnn" , 0, 5, 5, SigIeWiderBWChanSwitchAnn, {0, 0, 0, 0, 0}, 0, DOT11F_EID_WIDERBWCHANSWITCHANN, 0, 0, },
{offsetof(tDot11fBeaconIEs, OBSSScanParameters), offsetof(tDot11fIEOBSSScanParameters, present), 0, "OBSSScanParameters" , 0, 16, 16, SigIeOBSSScanParameters, {0, 0, 0, 0, 0}, 0, DOT11F_EID_OBSSSCANPARAMETERS, 0, 0, },
@@ -16506,7 +16506,7 @@
{offsetof(tDot11fProbeResponse, VHTCaps), offsetof(tDot11fIEVHTCaps, present), 0, "VHTCaps" , 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTCAPS, 0, 0, },
{offsetof(tDot11fProbeResponse, VHTOperation), offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation" , 0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTOPERATION, 0, 0, },
{offsetof(tDot11fProbeResponse, VHTExtBssLoad), offsetof(tDot11fIEVHTExtBssLoad, present), 0, "VHTExtBssLoad" , 0, 7, 7, SigIeVHTExtBssLoad, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTEXTBSSLOAD, 0, 0, },
- {offsetof(tDot11fProbeResponse, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 11, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
+ {offsetof(tDot11fProbeResponse, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 17, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
{offsetof(tDot11fProbeResponse, OBSSScanParameters), offsetof(tDot11fIEOBSSScanParameters, present), 0, "OBSSScanParameters" , 0, 16, 16, SigIeOBSSScanParameters, {0, 0, 0, 0, 0}, 0, DOT11F_EID_OBSSSCANPARAMETERS, 0, 0, },
{offsetof(tDot11fProbeResponse, hs20vendor_ie), offsetof(tDot11fIEhs20vendor_ie, present), 0, "hs20vendor_ie" , 0, 7, 9, SigIehs20vendor_ie, {80, 111, 154, 16, 0}, 4, DOT11F_EID_HS20VENDOR_IE, 0, 0, },
{offsetof(tDot11fProbeResponse, WiderBWChanSwitchAnn), offsetof(tDot11fIEWiderBWChanSwitchAnn, present), 0, "WiderBWChanSwitchAnn" , 0, 5, 5, SigIeWiderBWChanSwitchAnn, {0, 0, 0, 0, 0}, 0, DOT11F_EID_WIDERBWCHANSWITCHANN, 0, 0, },
@@ -18122,7 +18122,7 @@
{offsetof(tDot11fReAssocRequest, P2PIEOpaque), offsetof(tDot11fIEP2PIEOpaque, present), 0, "P2PIEOpaque" , 0, 8, 255, SigIeP2PIEOpaque, {80, 111, 154, 9, 0}, 4, DOT11F_EID_P2PIEOPAQUE, 0, 0, },
{offsetof(tDot11fReAssocRequest, WFDIEOpaque), offsetof(tDot11fIEWFDIEOpaque, present), 0, "WFDIEOpaque" , 0, 8, 255, SigIeWFDIEOpaque, {80, 111, 154, 10, 0}, 4, DOT11F_EID_WFDIEOPAQUE, 0, 0, },
{offsetof(tDot11fReAssocRequest, VHTCaps), offsetof(tDot11fIEVHTCaps, present), 0, "VHTCaps" , 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTCAPS, 0, 0, },
- {offsetof(tDot11fReAssocRequest, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 11, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
+ {offsetof(tDot11fReAssocRequest, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 17, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
{offsetof(tDot11fReAssocRequest, OperatingMode), offsetof(tDot11fIEOperatingMode, present), 0, "OperatingMode" , 0, 3, 3, SigIeOperatingMode, {0, 0, 0, 0, 0}, 0, DOT11F_EID_OPERATINGMODE, 0, 0, },
{offsetof(tDot11fReAssocRequest, QosMapSet), offsetof(tDot11fIEQosMapSet, present), 0, "QosMapSet" , 0, 2, 62, SigIeQosMapSet, {0, 0, 0, 0, 0}, 0, DOT11F_EID_QOSMAPSET, 0, 0, },
{offsetof(tDot11fReAssocRequest, hs20vendor_ie), offsetof(tDot11fIEhs20vendor_ie, present), 0, "hs20vendor_ie" , 0, 7, 9, SigIehs20vendor_ie, {80, 111, 154, 16, 0}, 4, DOT11F_EID_HS20VENDOR_IE, 0, 0, },
@@ -19165,7 +19165,7 @@
{offsetof(tDot11fReAssocResponse, P2PAssocRes), offsetof(tDot11fIEP2PAssocRes, present), 0, "P2PAssocRes" , 0, 6, 17, SigIeP2PAssocRes, {80, 111, 154, 9, 0}, 4, DOT11F_EID_P2PASSOCRES, 0, 0, },
{offsetof(tDot11fReAssocResponse, VHTCaps), offsetof(tDot11fIEVHTCaps, present), 0, "VHTCaps" , 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTCAPS, 0, 0, },
{offsetof(tDot11fReAssocResponse, VHTOperation), offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation" , 0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0}, 0, DOT11F_EID_VHTOPERATION, 0, 0, },
- {offsetof(tDot11fReAssocResponse, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 11, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
+ {offsetof(tDot11fReAssocResponse, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 17, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
{offsetof(tDot11fReAssocResponse, OBSSScanParameters), offsetof(tDot11fIEOBSSScanParameters, present), 0, "OBSSScanParameters" , 0, 16, 16, SigIeOBSSScanParameters, {0, 0, 0, 0, 0}, 0, DOT11F_EID_OBSSSCANPARAMETERS, 0, 0, },
{offsetof(tDot11fReAssocResponse, QosMapSet), offsetof(tDot11fIEQosMapSet, present), 0, "QosMapSet" , 0, 2, 62, SigIeQosMapSet, {0, 0, 0, 0, 0}, 0, DOT11F_EID_QOSMAPSET, 0, 0, },
{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, }, };
@@ -20453,7 +20453,7 @@
{offsetof(tDot11fTDLSDisRsp, SuppChannels), offsetof(tDot11fIESuppChannels, present), 0, "SuppChannels" , 0, 4, 98, SigIeSuppChannels, {0, 0, 0, 0, 0}, 0, DOT11F_EID_SUPPCHANNELS, 0, 0, },
{offsetof(tDot11fTDLSDisRsp, SuppOperatingClasses), offsetof(tDot11fIESuppOperatingClasses, present), 0, "SuppOperatingClasses" , 0, 3, 34, SigIeSuppOperatingClasses, {0, 0, 0, 0, 0}, 0, DOT11F_EID_SUPPOPERATINGCLASSES, 0, 0, },
{offsetof(tDot11fTDLSDisRsp, RSN), offsetof(tDot11fIERSN, present), 0, "RSN" , 0, 4, 116, SigIeRSN, {0, 0, 0, 0, 0}, 0, DOT11F_EID_RSN, 0, 0, },
- {offsetof(tDot11fTDLSDisRsp, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 11, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
+ {offsetof(tDot11fTDLSDisRsp, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 17, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
{offsetof(tDot11fTDLSDisRsp, FTInfo), offsetof(tDot11fIEFTInfo, present), 0, "FTInfo" , 0, 84, 222, SigIeFTInfo, {0, 0, 0, 0, 0}, 0, DOT11F_EID_FTINFO, 0, 0, },
{offsetof(tDot11fTDLSDisRsp, TimeoutInterval), offsetof(tDot11fIETimeoutInterval, present), 0, "TimeoutInterval" , 0, 7, 7, SigIeTimeoutInterval, {0, 0, 0, 0, 0}, 0, DOT11F_EID_TIMEOUTINTERVAL, 0, 0, },
{offsetof(tDot11fTDLSDisRsp, RICData), offsetof(tDot11fIERICData, present), 0, "RICData" , 0, 6, 6, SigIeRICData, {0, 0, 0, 0, 0}, 0, DOT11F_EID_RICDATA, 0, 0, },
@@ -21190,7 +21190,7 @@
{offsetof(tDot11fTDLSSetupReq, ExtSuppRates), offsetof(tDot11fIEExtSuppRates, present), 0, "ExtSuppRates" , 0, 3, 14, SigIeExtSuppRates, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTSUPPRATES, 0, 0, },
{offsetof(tDot11fTDLSSetupReq, SuppChannels), offsetof(tDot11fIESuppChannels, present), 0, "SuppChannels" , 0, 4, 98, SigIeSuppChannels, {0, 0, 0, 0, 0}, 0, DOT11F_EID_SUPPCHANNELS, 0, 0, },
{offsetof(tDot11fTDLSSetupReq, RSN), offsetof(tDot11fIERSN, present), 0, "RSN" , 0, 4, 116, SigIeRSN, {0, 0, 0, 0, 0}, 0, DOT11F_EID_RSN, 0, 0, },
- {offsetof(tDot11fTDLSSetupReq, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 11, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
+ {offsetof(tDot11fTDLSSetupReq, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 17, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
{offsetof(tDot11fTDLSSetupReq, SuppOperatingClasses), offsetof(tDot11fIESuppOperatingClasses, present), 0, "SuppOperatingClasses" , 0, 3, 34, SigIeSuppOperatingClasses, {0, 0, 0, 0, 0}, 0, DOT11F_EID_SUPPOPERATINGCLASSES, 0, 0, },
{offsetof(tDot11fTDLSSetupReq, QOSCapsStation), offsetof(tDot11fIEQOSCapsStation, present), 0, "QOSCapsStation" , 0, 3, 3, SigIeQOSCapsStation, {0, 0, 0, 0, 0}, 0, DOT11F_EID_QOSCAPSSTATION, 0, 0, },
{offsetof(tDot11fTDLSSetupReq, FTInfo), offsetof(tDot11fIEFTInfo, present), 0, "FTInfo" , 0, 84, 222, SigIeFTInfo, {0, 0, 0, 0, 0}, 0, DOT11F_EID_FTINFO, 0, 0, },
@@ -21575,7 +21575,7 @@
{offsetof(tDot11fTDLSSetupRsp, ExtSuppRates), offsetof(tDot11fIEExtSuppRates, present), 0, "ExtSuppRates" , 0, 3, 14, SigIeExtSuppRates, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTSUPPRATES, 0, 0, },
{offsetof(tDot11fTDLSSetupRsp, SuppChannels), offsetof(tDot11fIESuppChannels, present), 0, "SuppChannels" , 0, 4, 98, SigIeSuppChannels, {0, 0, 0, 0, 0}, 0, DOT11F_EID_SUPPCHANNELS, 0, 0, },
{offsetof(tDot11fTDLSSetupRsp, RSN), offsetof(tDot11fIERSN, present), 0, "RSN" , 0, 4, 116, SigIeRSN, {0, 0, 0, 0, 0}, 0, DOT11F_EID_RSN, 0, 0, },
- {offsetof(tDot11fTDLSSetupRsp, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 11, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
+ {offsetof(tDot11fTDLSSetupRsp, ExtCap), offsetof(tDot11fIEExtCap, present), 0, "ExtCap" , 0, 3, 17, SigIeExtCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, 0, },
{offsetof(tDot11fTDLSSetupRsp, SuppOperatingClasses), offsetof(tDot11fIESuppOperatingClasses, present), 0, "SuppOperatingClasses" , 0, 3, 34, SigIeSuppOperatingClasses, {0, 0, 0, 0, 0}, 0, DOT11F_EID_SUPPOPERATINGCLASSES, 0, 0, },
{offsetof(tDot11fTDLSSetupRsp, QOSCapsStation), offsetof(tDot11fIEQOSCapsStation, present), 0, "QOSCapsStation" , 0, 3, 3, SigIeQOSCapsStation, {0, 0, 0, 0, 0}, 0, DOT11F_EID_QOSCAPSSTATION, 0, 0, },
{offsetof(tDot11fTDLSSetupRsp, FTInfo), offsetof(tDot11fIEFTInfo, present), 0, "FTInfo" , 0, 84, 222, SigIeFTInfo, {0, 0, 0, 0, 0}, 0, DOT11F_EID_FTINFO, 0, 0, },
@@ -22723,16 +22723,13 @@
if (pIe)
{
- if ((nBufRemaining < pIe->minSize - pIe->noui - 2U) ||
- (len < pIe->minSize - pIe->noui - 2U))
+ if ((nBufRemaining < pIe->minSize - pIe->noui - 2U))
{
- FRAMES_LOG4(pCtx, FRLOGW, FRFL("The IE %s must "
+ FRAMES_LOG3(pCtx, FRLOGW, FRFL("The IE %s must "
"be at least %d bytes in size, but "
"there are only %d bytes remaining in "
- "this frame or the IE reports a size "
- "of %d bytes.\n"),
- pIe->name, pIe->minSize, nBufRemaining,
- (len + pIe->noui + 2U));
+ "this frame.\n"),
+ pIe->name, pIe->minSize, nBufRemaining);
FRAMES_DUMP(pCtx, FRLOG1, pBuf, nBuf);
status |= DOT11F_INCOMPLETE_IE;
FRAMES_DBG_BREAK();
@@ -22740,6 +22737,14 @@
}
else
{
+ if (len < pIe->minSize - pIe->noui - 2U) {
+ FRAMES_LOG3(pCtx, FRLOGW, FRFL("The IE %s must "
+ "be at least %d bytes in size, but "
+ "there are only %d bytes in the IE\n"),
+ pIe->name, pIe->minSize, (len + pIe->noui + 2U));
+ goto skip_ie;
+ }
+
if (len > pIe->maxSize - pIe->noui - 2U){
FRAMES_LOG1(pCtx, FRLOGW, FRFL("The IE %s reports "
"an unexpectedly large size; it is presumably "
@@ -22752,7 +22757,7 @@
countOffset = ( (0 != pIe->arraybound) * ( *(tANI_U16* )(pFrm + pIe->countOffset)));
if (0 != pIe->arraybound && countOffset >= pIe->arraybound) {
status |= DOT11F_DUPLICATE_IE;
- goto skip_dup_ie;
+ goto skip_ie;
}
switch (pIe->sig)
{
@@ -23232,7 +23237,7 @@
status |= DOT11F_UNKNOWN_IES;
}
-skip_dup_ie:
+skip_ie:
pBufRemaining += len;
if (len > nBufRemaining)
diff --git a/CORE/SYS/legacy/src/utils/src/parserApi.c b/CORE/SYS/legacy/src/utils/src/parserApi.c
index d71afcd..3c6111f 100644
--- a/CORE/SYS/legacy/src/utils/src/parserApi.c
+++ b/CORE/SYS/legacy/src/utils/src/parserApi.c
@@ -1110,6 +1110,8 @@
}
}
+ p_ext_cap->fils_capability = 0;
+
if (pDot11f->present)
{
/* Need to compute the num_bytes based on bits set */
diff --git a/CORE/VOSS/inc/vos_nvitem.h b/CORE/VOSS/inc/vos_nvitem.h
index f86bf80..fd1928c 100644
--- a/CORE/VOSS/inc/vos_nvitem.h
+++ b/CORE/VOSS/inc/vos_nvitem.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2015 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2015, 2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -47,6 +47,8 @@
#include "wlan_nv.h"
#include "wlan_nv2.h"
+extern bool init_by_reg_core_user;
+
/* Maximum number of channels per country can be ignored */
#define MAX_CHANNELS_IGNORE 10
#define MAX_COUNTRY_IGNORE 5
diff --git a/CORE/VOSS/src/vos_memory.c b/CORE/VOSS/src/vos_memory.c
index 3ed9dca..daff891 100644
--- a/CORE/VOSS/src/vos_memory.c
+++ b/CORE/VOSS/src/vos_memory.c
@@ -218,7 +218,7 @@
}
#endif
time_before_kmalloc = vos_timer_get_system_time();
- memPtr = kmalloc(size, flags);
+ memPtr = kzalloc(size, flags);
/* If time taken by kmalloc is greater than VOS_GET_MEMORY_TIME_THRESHOLD
* msec */
@@ -243,7 +243,7 @@
new_size = size + sizeof(struct s_vos_mem_struct) + 8;
time_before_kmalloc = vos_timer_get_system_time();
- memStruct = (struct s_vos_mem_struct*)kmalloc(new_size, flags);
+ memStruct = (struct s_vos_mem_struct*)kzalloc(new_size, flags);
/* If time taken by kmalloc is greater than VOS_GET_MEMORY_TIME_THRESHOLD
* msec */
if (vos_timer_get_system_time() - time_before_kmalloc >=
@@ -364,7 +364,7 @@
}
#endif
time_before_kmalloc = vos_timer_get_system_time();
- memPtr = kmalloc(size, flags);
+ memPtr = kzalloc(size, flags);
/* If time taken by kmalloc is greater than VOS_GET_MEMORY_TIME_THRESHOLD
* msec */
if (vos_timer_get_system_time() - time_before_kmalloc >=
diff --git a/CORE/VOSS/src/vos_nvitem.c b/CORE/VOSS/src/vos_nvitem.c
index 35ab905..d083f6a 100644
--- a/CORE/VOSS/src/vos_nvitem.c
+++ b/CORE/VOSS/src/vos_nvitem.c
@@ -60,6 +60,8 @@
#define IEEE80211_CHAN_NO_80MHZ 1<<7
#endif
+bool init_by_reg_core_user;
+
#ifdef CONFIG_ENABLE_LINUX_REG
static v_REGDOMAIN_t cur_reg_domain = REGDOMAIN_COUNT;
@@ -4064,6 +4066,9 @@
VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
"cfg80211 reg notifier callback for country for initiator %d", request->initiator);
+ pr_info("country: %c%c and initiator %d", request->alpha2[0],
+ request->alpha2[1], request->initiator);
+
if (NULL == pHddCtx)
{
VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
@@ -4204,6 +4209,9 @@
}
else
{
+ if (WLAN_HDD_IS_LOAD_IN_PROGRESS(pHddCtx))
+ init_by_reg_core_user = true;
+
sme_GenericChangeCountryCode(pHddCtx->hHal, country_code,
temp_reg_domain);
}
diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h
index db75533..c92345e 100644
--- a/CORE/WDA/inc/wlan_qct_wda.h
+++ b/CORE/WDA/inc/wlan_qct_wda.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -2064,28 +2064,17 @@
tANI_U32 arg1, tANI_U32 arg2, tANI_U32 arg3,
tANI_U32 arg4, tANI_U8 *pBuffer, wpt_boolean async);
-/*==========================================================================
- FUNCTION WDA_featureCapsExchange
-
- DESCRIPTION
- WDA API to invoke capability exchange between host and FW
-
- DEPENDENCIES
-
- PARAMETERS
-
- IN
- pVosContext VOS context
-
- OUT
- NONE
-
- RETURN VALUE
- NONE
-
- SIDE EFFECTS
-============================================================================*/
-void WDA_featureCapsExchange(v_PVOID_t pVosContext);
+/**
+ * WDA_featureCapsExchange() - WDA API to invoke capability exchange between
+ * host and FW
+ * @pVosContext: VOS context
+ * @request: Request to hold call-back to be invoked for response
+ *
+ * Return: VOS_STATUS
+ */
+VOS_STATUS
+WDA_featureCapsExchange(v_PVOID_t pVosContext,
+ struct sir_feature_caps_params *request);
void WDA_disableCapablityFeature(tANI_U8 feature_index);
/*==========================================================================
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index f500757..a18a1ee 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -20389,6 +20389,8 @@
}
if ( pWdaParams->wdaMsgParam != NULL)
vos_mem_free(pWdaParams->wdaMsgParam);
+ if (pWdaParams->wdaWdiApiMsgParam != NULL)
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
vos_mem_free(pWdaParams) ;
vosMsg.type = eWNI_SME_ROAM_SCAN_TRIGGER_RSP;
@@ -20424,6 +20426,8 @@
}
if ( pWdaParams->wdaMsgParam != NULL)
vos_mem_free(pWdaParams->wdaMsgParam);
+ if (pWdaParams->wdaWdiApiMsgParam != NULL)
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
vos_mem_free(pWdaParams) ;
vosMsg.type = eWNI_SME_ROAM_SCAN_OFFLOAD_RSP;
@@ -21291,14 +21295,95 @@
}
}
- /* FUNCTION WDA_featureCapsExchange
- * WDA API to invoke capability exchange between host and FW.
- */
-void WDA_featureCapsExchange(v_PVOID_t pVosContext)
+/**
+ * wda_feature_caps_cb() - Callback to be invoked for feature
+ * capability response received from firmware.
+ * @feat_caps_rsp: feature capability response
+ * @user_data: user input holding HDD callbacks
+ *
+ * Return: None
+ */
+void wda_feature_caps_cb(void *feat_caps_rsp, void *user_data)
{
- VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
- "%s:enter", __func__ );
- WDI_featureCapsExchangeReq( NULL, pVosContext);
+ tWDA_ReqParams *wda_params = user_data;
+ tWDA_CbContext *wda;
+ struct sir_feature_caps_params *params;
+
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "<------ %s " ,__func__);
+ if(!wda_params) {
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: wda params received NULL", __func__);
+ return;
+ }
+
+ wda = wda_params->pWdaContext;
+ params = wda_params->wdaMsgParam;
+ if(!params) {
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: params received NULL", __func__);
+ goto free_memory;
+ }
+
+ (params->feature_caps_cb)(params->user_data);
+ vos_mem_free(params);
+
+free_memory:
+ vos_mem_free(wda_params->wdaWdiApiMsgParam);
+ vos_mem_free(wda_params);
+}
+
+VOS_STATUS WDA_featureCapsExchange(v_PVOID_t pVosContext,
+ struct sir_feature_caps_params *request)
+{
+ WDI_Status status;
+ tWDA_CbContext *wda = NULL;
+ tWDA_ReqParams *wda_params = NULL;
+ struct sir_feature_caps_params *params = NULL;
+
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "%s:enter", __func__ );
+
+ wda = (tWDA_CbContext *)vos_get_context(VOS_MODULE_ID_WDA, pVosContext);
+ if(!wda) {
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s:pWDA is NULL", __func__);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ wda_params = vos_mem_malloc(sizeof(*wda_params));
+ if(!wda_params) {
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: VOS MEM Alloc Failure", __func__);
+ return VOS_STATUS_E_NOMEM;
+ }
+ vos_mem_zero(wda_params, sizeof(*wda_params));
+
+ if (request) {
+ params = vos_mem_malloc(sizeof(*params));
+ if (!params) {
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: VOS MEM Alloc Failure", __func__);
+ vos_mem_free(wda_params);
+ return VOS_STATUS_E_NOMEM;
+ }
+ vos_mem_zero(params, sizeof(*params));
+ *params = *request;
+ }
+
+ wda_params->pWdaContext = wda;
+ wda_params->wdaMsgParam = params;
+ wda_params->wdaWdiApiMsgParam = NULL;
+
+ status = WDI_featureCapsExchangeReq(wda_feature_caps_cb, wda_params);
+ if (status != WDI_STATUS_SUCCESS) {
+ if (params)
+ vos_mem_free(params);
+ vos_mem_free(wda_params);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ return VOS_STATUS_SUCCESS;
}
/* FUNCTION WDA_disableCapablityFeature
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi.c b/CORE/WDI/CP/src/wlan_qct_wdi.c
index e3f78a1..52583af 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -31049,7 +31049,7 @@
Send Start Request to HAL
-------------------------------------------------------------------------*/
return WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
- (WDI_StartRspCb)pEventData->pCBfnc,
+ pEventData->pCBfnc,
pEventData->pUserData, WDI_FEATURE_CAPS_EXCHANGE_RESP);
}/*WDI_ProcessFeatureCapsExchangeReq*/
@@ -31124,8 +31124,8 @@
wdiFeatureCapsExchangeCb = (WDI_featureCapsExchangeCb) pWDICtx -> pfncRspCB;
/*Notify UMAC - there is no callback right now but can be used in future if reqd */
- if (wdiFeatureCapsExchangeCb != NULL)
- wdiFeatureCapsExchangeCb(NULL, NULL);
+ if (wdiFeatureCapsExchangeCb)
+ wdiFeatureCapsExchangeCb(NULL, pWDICtx->pRspCBUserData);
return WDI_STATUS_SUCCESS;
}
diff --git a/Kbuild b/Kbuild
index d584ae8..d822f0f 100644
--- a/Kbuild
+++ b/Kbuild
@@ -88,6 +88,31 @@
endif
endif
+ifeq ($(KERNEL_BUILD), 0)
+ifeq ($(WLAN_PROPRIETARY),1)
+ WLAN_BLD_DIR := vendor/qcom/proprietary/wlan
+else
+ifneq ($(TARGET_SUPPORTS_WEARABLES),true)
+ifneq ($(ANDROID_BUILD_TOP),)
+ WLAN_BLD_DIR := $(ANDROID_BUILD_TOP)/vendor/qcom/opensource/wlan
+else
+ WLAN_BLD_DIR := vendor/qcom/opensource/wlan
+endif # ANDROID_BUILD_TOP
+else
+ifneq ($(ANDROID_BUILD_TOP),)
+ WLAN_BLD_DIR := $(ANDROID_BUILD_TOP)/device/qcom/msm8909w/opensource/wlan
+else
+ WLAN_BLD_DIR := device/qcom/msm8909w/opensource/wlan
+endif # ANDROID_BUILD_TOP
+endif # TARGET_SUPPORTS_WEARABLES
+endif # WLAN_PROPRIETARY
+
+ifneq ($(ANDROID_BUILD_TOP),)
+WLAN_ROOT=$(WLAN_BLD_DIR)/prima
+else
+WLAN_ROOT=$(KERNEL_TO_BUILD_ROOT_OFFSET)$(WLAN_BLD_DIR)/prima
+endif # ANDROID_BUILD_TOP
+endif # KERNEL_BUILD
ifeq ($(CONFIG_PRIMA_WLAN_BTAMP),y)
############ BAP ############
diff --git a/riva/inc/wlan_hal_msg.h b/riva/inc/wlan_hal_msg.h
index d0a83fb..f859c9d 100644
--- a/riva/inc/wlan_hal_msg.h
+++ b/riva/inc/wlan_hal_msg.h
@@ -1,6 +1,6 @@
/*
- * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
*
@@ -628,6 +628,9 @@
WLAN_HAL_FW_GET_ARP_STATS_REQ = 356,
WLAN_HAL_FW_GET_ARP_STATS_RSP = 357,
+ WLAN_HAL_POWER_CONTROL_MODE_CHANGE_REQ = 358,
+ WLAN_HAL_POWER_CONTROL_MODE_CHANGE_RSP = 359,
+
WLAN_HAL_VOWIFI_IND = 360,
WLAN_HAL_QPOWER_ENABLE_BY_HOST_IND = 361,
@@ -9729,6 +9732,36 @@
tdbugArpStatsgetRspParams fwArpstatsRspParams;
} tHalARPfwStatsRspMsg, *tpHalARPfwStatsRspMsg;
+/*----------------------------------------------------------------
+ * WLAN_HAL_POWER_CONTROL_MODE_CHANGE_REQ
+ *-----------------------------------------------------------------*/
+
+typedef PACKED_PRE struct PACKED_POST
+{
+ tANI_U8 enable;
+} tHalPowerControlModeChangeReqParams, *tpHalPowerControlModeChangeReqParams;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+ tHalMsgHeader header;
+ tHalPowerControlModeChangeReqParams pwrCtrlModeChangeReqParams;
+} tHalPowerControlModeChangeReqMsg, *tpHalPowerControlModeChangeReqMsg;
+
+/*----------------------------------------------------------------
+ * WLAN_HAL_POWER_CONTROL_MODE_CHANGE_RSP
+ *-----------------------------------------------------------------*/
+
+typedef PACKED_PRE struct PACKED_POST
+{
+ tANI_U32 status;
+} tHalPowerControlModeChangeRspParams, *tpHalPowerControlModeChangeRspParams;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+ tHalMsgHeader header;
+ tHalPowerControlModeChangeRspParams pwrCtrlModeChangeRspParams;
+} tHalPowerControlModeChangeRspMsg, *tpHalPowerControlModeChangeRspMsg;
+
#if defined(__ANI_COMPILER_PRAGMA_PACK_STACK)
#pragma pack(pop)
#elif defined(__ANI_COMPILER_PRAGMA_PACK)