Explorar o código

qcacld-3.0: Retrieve BSSID to support vendor scan

Host doesnt have changes to support specific BSSID vendor scan
if supplicant set specific BSSID.

Add changes to get BSSID to do specific scan if supplicant set BSSID.

Change-Id: I2b0ba590814e6c99f7003abdf855d3264b03a060
CRs-Fixed: 1099020
Sreelakshmi Konamki %!s(int64=8) %!d(string=hai) anos
pai
achega
8b8257c844

+ 2 - 0
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

+ 35 - 0
core/hdd/src/wlan_hdd_scan.c

@@ -1977,6 +1977,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
@@ -2147,6 +2172,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;

+ 5 - 2
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;