From: Alexander Simon <an.alexsimon@googlemail.com>
To: linux-wireless@vger.kernel.org
Subject: [PATCH v2 2/4] cfg80211: Add cfg80211_get_bss_ht to also match HT configuration
Date: Mon, 29 Aug 2011 16:30:41 +0200 [thread overview]
Message-ID: <5559682.keg4y6PyKd@alex-1> (raw)
In-Reply-To: <2053881.ENil2Dy3QM@alex-1>
Keep cfg80211_get_bss for compatibility but make use of this new function by
matching any HT configuration.
Signed-off-by: Alexander Simon <alexander.simon@saxnet.de>
---
include/net/cfg80211.h | 35 ++++++++++++++++++++++++++++-------
net/wireless/scan.c | 39 ++++++++++++++++++++++++++++++++++++---
2 files changed, 64 insertions(+), 10 deletions(-)
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 6d6e4b1..a461b68 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -2577,18 +2577,39 @@ cfg80211_inform_bss(struct wiphy *wiphy,
const u8 *ie, size_t ielen,
s32 signal, gfp_t gfp);
-struct cfg80211_bss *cfg80211_get_bss(struct wiphy *wiphy,
- struct ieee80211_channel *channel,
- const u8 *bssid,
- const u8 *ssid, size_t ssid_len,
- u16 capa_mask, u16 capa_val);
+/**
+ * cfg80211_get_bss_ht - search for an BSS in scan results
+ * @wiphy: the wiphy
+ * @bssid: BSSID to match, if set
+ * @ssid: SSID to match
+ * @ssid_len: length of the SSID
+ * @capa_mask: AND mask for capabilities comparison
+ * @capa_val: SSID capabilities to match
+ * @check_ht: if to match for an HT mode
+ * @ht_mode: HT mode to match
+ *
+ * Return the first BSS found in the last scan.
+ * No match return NULL.
+ */
+struct cfg80211_bss *
+cfg80211_get_bss_ht(struct wiphy *wiphy, struct ieee80211_channel *channel,
+ const u8 *bssid, const u8 *ssid, size_t ssid_len,
+ u16 capa_mask, u16 capa_val, bool check_ht,
+ enum nl80211_channel_type ht_mode);
+
+struct cfg80211_bss *
+cfg80211_get_bss(struct wiphy *wiphy, struct ieee80211_channel *channel,
+ const u8 *bssid, const u8 *ssid, size_t ssid_len,
+ u16 capa_mask, u16 capa_val);
+
static inline struct cfg80211_bss *
cfg80211_get_ibss(struct wiphy *wiphy,
struct ieee80211_channel *channel,
const u8 *ssid, size_t ssid_len)
{
- return cfg80211_get_bss(wiphy, channel, NULL, ssid, ssid_len,
- WLAN_CAPABILITY_IBSS, WLAN_CAPABILITY_IBSS);
+ return cfg80211_get_bss_ht(wiphy, channel, NULL, ssid, ssid_len,
+ WLAN_CAPABILITY_IBSS, WLAN_CAPABILITY_IBSS,
+ false, NL80211_CHAN_NO_HT);
}
struct cfg80211_bss *cfg80211_get_mesh(struct wiphy *wiphy,
diff --git a/net/wireless/scan.c b/net/wireless/scan.c
index b0f0039..dcc608b 100644
--- a/net/wireless/scan.c
+++ b/net/wireless/scan.c
@@ -365,6 +365,21 @@ struct cfg80211_bss *cfg80211_get_bss(struct wiphy
*wiphy,
const u8 *ssid, size_t ssid_len,
u16 capa_mask, u16 capa_val)
{
+ /* call HT version with no HT requirements */
+ return cfg80211_get_bss_ht(wiphy, channel, bssid, ssid, ssid_len,
+ capa_mask, capa_val, false,
+ NL80211_CHAN_NO_HT);
+}
+EXPORT_SYMBOL(cfg80211_get_bss);
+
+struct cfg80211_bss *cfg80211_get_bss_ht(struct wiphy *wiphy,
+ struct ieee80211_channel *channel,
+ const u8 *bssid,
+ const u8 *ssid, size_t ssid_len,
+ u16 capa_mask, u16 capa_val,
+ bool check_ht,
+ enum nl80211_channel_type ht_mode)
+{
struct cfg80211_registered_device *dev = wiphy_to_dev(wiphy);
struct cfg80211_internal_bss *bss, *res = NULL;
unsigned long now = jiffies;
@@ -374,8 +389,26 @@ struct cfg80211_bss *cfg80211_get_bss(struct wiphy
*wiphy,
list_for_each_entry(bss, &dev->bss_list, list) {
if ((bss->pub.capability & capa_mask) != capa_val)
continue;
- if (channel && bss->pub.channel != channel)
- continue;
+ if (channel) {
+ if (bss->pub.channel != channel)
+ continue;
+ if (check_ht) {
+ struct ieee80211_ht_info *ht_info;
+ ht_info = (struct ieee80211_ht_info *)
+ ieee80211_bss_get_ie(&bss->pub,
+ WLAN_EID_HT_INFORMATION);
+ if (!ht_info)
+ continue;
+ if (ht_mode == NL80211_CHAN_HT40MINUS &&
+ !(ht_info->ht_param &
+ IEEE80211_HT_PARAM_CHA_SEC_BELOW))
+ continue;
+ if (ht_mode == NL80211_CHAN_HT40PLUS &&
+ !(ht_info->ht_param &
+ IEEE80211_HT_PARAM_CHA_SEC_ABOVE))
+ continue;
+ }
+ }
/* Don't get expired BSS structs */
if (time_after(now, bss->ts + IEEE80211_SCAN_RESULT_EXPIRE) &&
!atomic_read(&bss->hold))
@@ -392,7 +425,7 @@ struct cfg80211_bss *cfg80211_get_bss(struct wiphy *wiphy,
return NULL;
return &res->pub;
}
-EXPORT_SYMBOL(cfg80211_get_bss);
+EXPORT_SYMBOL(cfg80211_get_bss_ht);
struct cfg80211_bss *cfg80211_get_mesh(struct wiphy *wiphy,
struct ieee80211_channel *channel,
--
1.7.3.4
next prev parent reply other threads:[~2011-08-29 14:31 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-29 14:15 [PATCH v2 1/4] nl80211: Parse channel type attribute in an IBSS join request Alexander Simon
2011-08-29 14:30 ` Alexander Simon [this message]
2011-08-31 6:37 ` [PATCH v2 2/4] cfg80211: Add cfg80211_get_bss_ht to also match HT configuration Johannes Berg
2011-09-09 14:07 ` Marek Lindner
2011-08-29 14:31 ` [PATCH v2 3/4] mac80211: Add HT helper functions Alexander Simon
2011-08-31 6:38 ` Johannes Berg
2011-08-29 14:32 ` [PATCH v2 4/4] mac80211: Add HT operation modes for IBSS Alexander Simon
2011-09-09 14:17 ` Marek Lindner
2011-08-31 6:36 ` [PATCH v2 1/4] nl80211: Parse channel type attribute in an IBSS join request Johannes Berg
2011-08-31 13:49 ` Alexander Simon
2011-09-01 13:18 ` Johannes Berg
2011-08-31 15:51 ` Marek Lindner
2011-08-31 16:44 ` Alexander Simon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5559682.keg4y6PyKd@alex-1 \
--to=an.alexsimon@googlemail.com \
--cc=linux-wireless@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).