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@xxxxxxxxx> --- include/net/cfg80211.h | 6 ++++++ net/wireless/chan.c | 1 + net/wireless/scan.c | 37 ++++++++++++++++++++++++++++++++++--- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 738db17..8276b19 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -2581,6 +2581,12 @@ struct cfg80211_bss *cfg80211_get_bss(struct wiphy *wiphy, const u8 *bssid, const u8 *ssid, size_t ssid_len, u16 capa_mask, u16 capa_val); +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, + enum nl80211_channel_type channel_type); static inline struct cfg80211_bss * cfg80211_get_ibss(struct wiphy *wiphy, struct ieee80211_channel *channel, diff --git a/net/wireless/chan.c b/net/wireless/chan.c index cd630e1..046b113 100644 --- a/net/wireless/chan.c +++ b/net/wireless/chan.c @@ -75,6 +75,7 @@ bool can_beacon_sec_chan(struct wiphy *wiphy, return true; } +EXPORT_SYMBOL(can_beacon_sec_chan); int cfg80211_set_freq(struct cfg80211_registered_device *rdev, struct wireless_dev *wdev, int freq, diff --git a/net/wireless/scan.c b/net/wireless/scan.c index 2936cb8..ff5b736 100644 --- a/net/wireless/scan.c +++ b/net/wireless/scan.c @@ -364,6 +364,19 @@ 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, 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, + enum nl80211_channel_type require_ht) +{ struct cfg80211_registered_device *dev = wiphy_to_dev(wiphy); struct cfg80211_internal_bss *bss, *res = NULL; unsigned long now = jiffies; @@ -373,8 +386,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 (require_ht != NL80211_CHAN_NO_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 (require_ht == NL80211_CHAN_HT40MINUS && + !(ht_info->ht_param & + IEEE80211_HT_PARAM_CHA_SEC_BELOW)) + continue; + if (require_ht == 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)) @@ -391,7 +422,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 -- 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