diff options
| -rw-r--r-- | core/hdd/src/wlan_hdd_cfg80211.h | 2 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_scan.c | 35 | ||||
| -rw-r--r-- | core/sme/src/csr/csr_api_scan.c | 7 |
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; |
