Search Linux Wireless

[RFC 5/5] nl80211/cfg80211: adding intermediate scan result filter.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



User might want to be notified with intermediate scan results only
above some minimal RSSI. Adding new NL80211_ATTR_IM_SCAN_RESULT_MIN_RSSI
u32 attribute for the intermediate scan results  RSSI filtering mechanism,
which will significantly reduce unnecessary Kernel-User traffic.
It might be optionally enabled during NL80211_CMD_TRIGGER_SCAN.

Signed-off-by: Victor Goldenshtein <VictorG@xxxxxx>
---
 include/linux/nl80211.h |    5 +++++
 net/wireless/core.h     |    1 +
 net/wireless/nl80211.c  |   13 +++++++++++--
 net/wireless/scan.c     |    4 ++++
 4 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h
index 5a10ec0..44cc394 100644
--- a/include/linux/nl80211.h
+++ b/include/linux/nl80211.h
@@ -1063,6 +1063,10 @@ enum nl80211_commands {
  *	scan result notification event (%NL80211_CMD_IM_SCAN_RESULT)
  *	for the %NL80211_CMD_TRIGGER_SCAN command.
  *	When set: will notify on each new scan result in the cache.
+ * @%NL80211_ATTR_IM_SCAN_RESULT_MIN_RSSI: Intermediate event filtering.
+ *	When set: will notify only those new scan result whose signal
+ *	strength of probe response/beacon (in dBm) is stronger than this
+ *	negative value (usually: -20 dBm > X > -95 dBm).
  *
  * @NL80211_ATTR_MAX: highest attribute number currently defined
  * @__NL80211_ATTR_AFTER_LAST: internal use
@@ -1275,6 +1279,7 @@ enum nl80211_attrs {
 	NL80211_ATTR_IE_ASSOC_RESP,
 
 	NL80211_ATTR_IM_SCAN_RESULT,
+	NL80211_ATTR_IM_SCAN_RESULT_MIN_RSSI,
 
 	/* add attributes here, update the policy in nl80211.c */
 
diff --git a/net/wireless/core.h b/net/wireless/core.h
index 7484255..bacd5b3 100644
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
@@ -78,6 +78,7 @@ struct cfg80211_registered_device {
 
 	/* intermediate scan result configuration */
 	bool im_scan_result;
+	s32  im_scan_result_min_rssi_mbm;
 
 	/* must be last because of the way we do wiphy_priv(),
 	 * and it should at least be aligned to NETDEV_ALIGN */
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 9e60b48..82c7b40 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -190,6 +190,7 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
 	[NL80211_ATTR_IE_ASSOC_RESP] = { .type = NLA_BINARY,
 					 .len = IEEE80211_MAX_DATA_LEN },
 	[NL80211_ATTR_IM_SCAN_RESULT] = { .type = NLA_FLAG },
+	[NL80211_ATTR_IM_SCAN_RESULT_MIN_RSSI] = { .type = NLA_U32 },
 };
 
 /* policy for the key attributes */
@@ -3558,10 +3559,18 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
 		}
 	}
 
-	if (info->attrs[NL80211_ATTR_IM_SCAN_RESULT])
+	if (info->attrs[NL80211_ATTR_IM_SCAN_RESULT]) {
 		rdev->im_scan_result = 1;
-	else
+		if (info->attrs[NL80211_ATTR_IM_SCAN_RESULT_MIN_RSSI]) {
+			attr = info->attrs[NL80211_ATTR_IM_SCAN_RESULT_MIN_RSSI];
+			rdev->im_scan_result_min_rssi_mbm =
+				DBM_TO_MBM(nla_get_u32(attr));
+		} else {
+			rdev->im_scan_result_min_rssi_mbm = 0;
+		}
+	} else {
 		rdev->im_scan_result = 0;
+	}
 
 	request->dev = dev;
 	request->wiphy = &rdev->wiphy;
diff --git a/net/wireless/scan.c b/net/wireless/scan.c
index 9be42c3..257c70a 100644
--- a/net/wireless/scan.c
+++ b/net/wireless/scan.c
@@ -183,6 +183,10 @@ void cfg80211_send_intermediate_result(struct net_device *dev,
 	if ((!rdev->im_scan_result) || (!rdev->scan_req) || (!cbss))
 		return;
 
+	if ((rdev->im_scan_result_min_rssi_mbm) &&
+		(rdev->im_scan_result_min_rssi_mbm > cbss->signal))
+		return;
+
 	ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
 	if (!ev)
 		return;
-- 
1.7.0.4

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux