cfg80211: Allow a scan request for a specific BSSID
This allows scans for a specific BSSID to be optimized by the user space application by requesting the driver to set the Probe Request frame BSSID field (Address 3) to the specified BSSID instead of the wildcard BSSID. This prevents other APs from replying which reduces airtime need and latency in getting the response from the target AP through. This is an optimization and as such, it is acceptable for some of the drivers not to support the mechanism. If not supported, the wildcard BSSID will be used and more responses may be received. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com> Git-commit: 0889675a9503f48d1ad01b4eaa202f89469b2b62 Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Change-Id: I20cf654661c11880055d022e0c9ec77beab659e8 CRs-fixed: 996660 Signed-off-by: Vidyullatha Kanchanapally <vidyullatha@codeaurora.org>
This commit is contained in:
parent
ad26484ca8
commit
b094ea07e7
|
@ -1281,6 +1281,7 @@ struct cfg80211_ssid {
|
|||
* @wdev: the wireless device to scan for
|
||||
* @aborted: (internal) scan request was notified as aborted
|
||||
* @no_cck: used to send probe requests at non CCK rate in 2GHz band
|
||||
* @bssid: BSSID to scan for (most commonly, the wildcard BSSID)
|
||||
*/
|
||||
struct cfg80211_scan_request {
|
||||
struct cfg80211_ssid *ssids;
|
||||
|
@ -1294,6 +1295,8 @@ struct cfg80211_scan_request {
|
|||
|
||||
struct wireless_dev *wdev;
|
||||
|
||||
u8 bssid[ETH_ALEN] __aligned(2);
|
||||
|
||||
/* internal */
|
||||
struct wiphy *wiphy;
|
||||
unsigned long scan_start;
|
||||
|
|
|
@ -263,7 +263,9 @@
|
|||
* @NL80211_CMD_GET_SCAN: get scan results
|
||||
* @NL80211_CMD_TRIGGER_SCAN: trigger a new scan with the given parameters
|
||||
* %NL80211_ATTR_TX_NO_CCK_RATE is used to decide whether to send the
|
||||
* probe requests at CCK rate or not.
|
||||
* probe requests at CCK rate or not. %NL80211_ATTR_MAC can be used to
|
||||
* specify a BSSID to scan for; if not included, the wildcard BSSID will
|
||||
* be used.
|
||||
* @NL80211_CMD_NEW_SCAN_RESULTS: scan notification (as a reply to
|
||||
* NL80211_CMD_GET_SCAN and on the "scan" multicast group)
|
||||
* @NL80211_CMD_SCAN_ABORTED: scan was aborted, for unspecified reasons,
|
||||
|
|
|
@ -5426,6 +5426,12 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
|
|||
request->no_cck =
|
||||
nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
|
||||
|
||||
if (info->attrs[NL80211_ATTR_MAC])
|
||||
memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]),
|
||||
ETH_ALEN);
|
||||
else
|
||||
eth_broadcast_addr(request->bssid);
|
||||
|
||||
request->wdev = wdev;
|
||||
request->wiphy = &rdev->wiphy;
|
||||
request->scan_start = jiffies;
|
||||
|
|
|
@ -1159,6 +1159,8 @@ int cfg80211_wext_siwscan(struct net_device *dev,
|
|||
if (wiphy->bands[i])
|
||||
creq->rates[i] = (1 << wiphy->bands[i]->n_bitrates) - 1;
|
||||
|
||||
eth_broadcast_addr(creq->bssid);
|
||||
|
||||
rdev->scan_req = creq;
|
||||
err = rdev_scan(rdev, creq);
|
||||
if (err) {
|
||||
|
|
|
@ -172,6 +172,8 @@ static int cfg80211_conn_scan(struct wireless_dev *wdev)
|
|||
wdev->conn->params.ssid_len);
|
||||
request->ssids[0].ssid_len = wdev->conn->params.ssid_len;
|
||||
|
||||
eth_broadcast_addr(request->bssid);
|
||||
|
||||
request->wdev = wdev;
|
||||
request->wiphy = &rdev->wiphy;
|
||||
request->scan_start = jiffies;
|
||||
|
|
Loading…
Reference in New Issue