nl80211: specify RSSI threshold in scheduled scan
Support configuring an RSSI threshold in dBm (s32) when requesting scheduled scan, below which a BSS won't be reported by the cfg80211 driver. Signed-off-by: Thomas Pedersen <c_tpeder@qca.qualcomm.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
d0f718c1c0
commit
88e920b450
3 changed files with 16 additions and 1 deletions
|
@ -1542,6 +1542,9 @@ enum nl80211_attrs {
|
|||
|
||||
#define NL80211_MIN_REMAIN_ON_CHANNEL_TIME 10
|
||||
|
||||
/* default RSSI threshold for scan results if none specified. */
|
||||
#define NL80211_SCAN_RSSI_THOLD_OFF -300
|
||||
|
||||
/**
|
||||
* enum nl80211_iftype - (virtual) interface types
|
||||
*
|
||||
|
@ -1974,6 +1977,8 @@ enum nl80211_reg_rule_attr {
|
|||
* @__NL80211_SCHED_SCAN_MATCH_ATTR_INVALID: attribute number 0 is reserved
|
||||
* @NL80211_SCHED_SCAN_MATCH_ATTR_SSID: SSID to be used for matching,
|
||||
* only report BSS with matching SSID.
|
||||
* @NL80211_SCHED_SCAN_MATCH_ATTR_RSSI: RSSI threshold (in dBm) for reporting a
|
||||
* BSS in scan results. Filtering is turned off if not specified.
|
||||
* @NL80211_SCHED_SCAN_MATCH_ATTR_MAX: highest scheduled scan filter
|
||||
* attribute number currently defined
|
||||
* @__NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST: internal use
|
||||
|
@ -1982,6 +1987,7 @@ enum nl80211_sched_scan_match_attr {
|
|||
__NL80211_SCHED_SCAN_MATCH_ATTR_INVALID,
|
||||
|
||||
NL80211_SCHED_SCAN_MATCH_ATTR_SSID,
|
||||
NL80211_SCHED_SCAN_MATCH_ATTR_RSSI,
|
||||
|
||||
/* keep last */
|
||||
__NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST,
|
||||
|
|
|
@ -1027,6 +1027,7 @@ struct cfg80211_match_set {
|
|||
* @wiphy: the wiphy this was for
|
||||
* @dev: the interface
|
||||
* @channels: channels to scan
|
||||
* @rssi_thold: don't report scan results below this threshold (in s32 dBm)
|
||||
*/
|
||||
struct cfg80211_sched_scan_request {
|
||||
struct cfg80211_ssid *ssids;
|
||||
|
@ -1037,6 +1038,7 @@ struct cfg80211_sched_scan_request {
|
|||
size_t ie_len;
|
||||
struct cfg80211_match_set *match_sets;
|
||||
int n_match_sets;
|
||||
s32 rssi_thold;
|
||||
|
||||
/* internal */
|
||||
struct wiphy *wiphy;
|
||||
|
|
|
@ -340,6 +340,7 @@ static const struct nla_policy
|
|||
nl80211_match_policy[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1] = {
|
||||
[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] = { .type = NLA_BINARY,
|
||||
.len = IEEE80211_MAX_SSID_LEN },
|
||||
[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI] = { .type = NLA_U32 },
|
||||
};
|
||||
|
||||
/* ifidx get helper */
|
||||
|
@ -4387,7 +4388,7 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
|
|||
nla_for_each_nested(attr,
|
||||
info->attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
|
||||
tmp) {
|
||||
struct nlattr *ssid;
|
||||
struct nlattr *ssid, *rssi;
|
||||
|
||||
nla_parse(tb, NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
|
||||
nla_data(attr), nla_len(attr),
|
||||
|
@ -4403,6 +4404,12 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
|
|||
request->match_sets[i].ssid.ssid_len =
|
||||
nla_len(ssid);
|
||||
}
|
||||
rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
|
||||
if (rssi)
|
||||
request->rssi_thold = nla_get_u32(rssi);
|
||||
else
|
||||
request->rssi_thold =
|
||||
NL80211_SCAN_RSSI_THOLD_OFF;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue