wlan: Add support to randomize probe req SA
To improve user-privacy, add support to randomize source address of
probe request frames using mac-addr and mac-mask received
cfg80211 scan request.
Change-Id: I2a191469cbea1139b0a51cbcb06e24a2af3da7fc
CRs-Fixed: 2378863
diff --git a/CORE/HDD/inc/wlan_hdd_cfg80211.h b/CORE/HDD/inc/wlan_hdd_cfg80211.h
index a6f5a35..617d5bb 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg80211.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg80211.h
@@ -1900,4 +1900,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/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 2a0719f..0d2175b 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.
*
@@ -9107,6 +9107,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()
@@ -15206,6 +15220,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
@@ -15696,27 +15911,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,
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 8d1e421..9da590f 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -13864,6 +13864,8 @@
goto err_vosstop;
}
+ wlan_hdd_cfg80211_scan_randomization_init(wiphy);
+
#ifndef CONFIG_ENABLE_LINUX_REG
wlan_hdd_cfg80211_update_reg_info( wiphy );
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..f665446 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
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/limProcessMlmReqMessages.c b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
index a3c05cb..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);
@@ -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 f4b599c..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;
@@ -5602,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) );
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/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 658c17a..6be4f82 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
{
diff --git a/CORE/SME/src/csr/csrApiScan.c b/CORE/SME/src/csr/csrApiScan.c
index 4fe6095..4e46942 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.
*
@@ -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;
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index eede4ba..8ced3dc 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.
*
@@ -13292,7 +13292,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;
@@ -13310,6 +13311,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 ) )
{