summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/hdd/src/wlan_hdd_cfg80211.h2
-rw-r--r--core/hdd/src/wlan_hdd_scan.c35
-rw-r--r--core/sme/src/csr/csr_api_scan.c7
3 files changed, 42 insertions, 2 deletions
diff --git a/core/hdd/src/wlan_hdd_cfg80211.h b/core/hdd/src/wlan_hdd_cfg80211.h
index f61224ab2677..a85133831842 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.h
+++ b/core/hdd/src/wlan_hdd_cfg80211.h
@@ -1732,6 +1732,7 @@ enum qca_wlan_vendor_attr_set_scanning_mac_oui {
* scan flag is set
* @QCA_WLAN_VENDOR_ATTR_SCAN_MAC_MASK: 6-byte MAC address mask to be used with
* randomisation
+ * @QCA_WLAN_VENDOR_ATTR_SCAN_BSSID: BSSID provided to do scan for specific BSS
*/
enum qca_wlan_vendor_attr_scan {
QCA_WLAN_VENDOR_ATTR_SCAN_INVALID_PARAM = 0,
@@ -1745,6 +1746,7 @@ enum qca_wlan_vendor_attr_scan {
QCA_WLAN_VENDOR_ATTR_SCAN_STATUS,
QCA_WLAN_VENDOR_ATTR_SCAN_MAC,
QCA_WLAN_VENDOR_ATTR_SCAN_MAC_MASK,
+ QCA_WLAN_VENDOR_ATTR_SCAN_BSSID,
QCA_WLAN_VENDOR_ATTR_SCAN_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_SCAN_MAX =
QCA_WLAN_VENDOR_ATTR_SCAN_AFTER_LAST - 1
diff --git a/core/hdd/src/wlan_hdd_scan.c b/core/hdd/src/wlan_hdd_scan.c
index 001a9031a39d..c84f407f06b2 100644
--- a/core/hdd/src/wlan_hdd_scan.c
+++ b/core/hdd/src/wlan_hdd_scan.c
@@ -1964,6 +1964,31 @@ static int wlan_hdd_send_scan_start_event(struct wiphy *wiphy,
return ret;
}
+
+/**
+ * wlan_hdd_copy_bssid() - API to copy the bssid to vendor Scan request
+ * @request: Pointer to vendor scan request
+ * @bssid: Pointer to BSSID
+ *
+ * This API copies the specific BSSID received from Supplicant and copies it to
+ * the vendor Scan request
+ *
+ * Return: None
+ */
+#if defined(CFG80211_SCAN_BSSID) || \
+ (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0))
+static inline void wlan_hdd_copy_bssid(struct cfg80211_scan_request *request,
+ uint8_t *bssid)
+{
+ qdf_mem_copy(request->bssid, bssid, QDF_MAC_ADDR_SIZE);
+}
+#else
+static inline void wlan_hdd_copy_bssid(struct cfg80211_scan_request *request,
+ uint8_t *bssid)
+{
+}
+#endif
+
/**
* __wlan_hdd_cfg80211_vendor_scan() - API to process venor scan request
* @wiphy: Pointer to wiphy
@@ -2134,6 +2159,16 @@ static int __wlan_hdd_cfg80211_vendor_scan(struct wiphy *wiphy,
goto error;
}
}
+
+ if (tb[QCA_WLAN_VENDOR_ATTR_SCAN_BSSID]) {
+ if (nla_len(tb[QCA_WLAN_VENDOR_ATTR_SCAN_BSSID]) <
+ QDF_MAC_ADDR_SIZE) {
+ hdd_err("invalid bssid length");
+ goto error;
+ }
+ wlan_hdd_copy_bssid(request,
+ nla_data(tb[QCA_WLAN_VENDOR_ATTR_SCAN_BSSID]));
+ }
request->no_cck =
nla_get_flag(tb[QCA_WLAN_VENDOR_ATTR_SCAN_TX_NO_CCK_RATE]);
request->wdev = wdev;
diff --git a/core/sme/src/csr/csr_api_scan.c b/core/sme/src/csr/csr_api_scan.c
index 92fa1afda4e2..948831fd5967 100644
--- a/core/sme/src/csr/csr_api_scan.c
+++ b/core/sme/src/csr/csr_api_scan.c
@@ -622,12 +622,13 @@ QDF_STATUS csr_scan_request(tpAniSirGlobal pMac, uint16_t sessionId,
QDF_TIMER_TYPE_SW,
csr_scan_active_list_timeout_handle, scan_cmd);
sms_log(pMac, LOG1,
- FL("SId=%d scanId=%d Scan reason=%u numSSIDs=%d numChan=%d P2P search=%d minCT=%d maxCT=%d uIEFieldLen=%d"),
+ FL("SId=%d scanId=%d Scan reason=%u numSSIDs=%d numChan=%d P2P search=%d minCT=%d maxCT=%d uIEFieldLen=%d BSSID: " MAC_ADDRESS_STR),
sessionId, scan_cmd->u.scanCmd.scanID,
scan_cmd->u.scanCmd.reason, pTempScanReq->SSIDs.numOfSSIDs,
pTempScanReq->ChannelInfo.numOfChannels,
pTempScanReq->p2pSearch, pTempScanReq->minChnTime,
- pTempScanReq->maxChnTime, pTempScanReq->uIEFieldLen);
+ pTempScanReq->maxChnTime, pTempScanReq->uIEFieldLen,
+ MAC_ADDR_ARRAY(scan_cmd->u.scanCmd.u.scanRequest.bssid.bytes));
status = csr_queue_sme_command(pMac, scan_cmd, false);
if (!QDF_IS_STATUS_SUCCESS(status)) {
@@ -5660,6 +5661,8 @@ QDF_STATUS csr_scan_copy_request(tpAniSirGlobal mac_ctx,
goto complete;
}
} /* Allocate memory for SSID List */
+ qdf_mem_copy(&dst_req->bssid, &src_req->bssid,
+ sizeof(struct qdf_mac_addr));
dst_req->p2pSearch = src_req->p2pSearch;
dst_req->skipDfsChnlInP2pSearch =
src_req->skipDfsChnlInP2pSearch;