|
@@ -80,7 +80,8 @@ void cfg80211_bss_expire(struct cfg80211_registered_device *dev)
|
|
|
bool expired = false;
|
|
|
|
|
|
list_for_each_entry_safe(bss, tmp, &dev->bss_list, list) {
|
|
|
- if (!time_after(jiffies, bss->ts + IEEE80211_SCAN_RESULT_EXPIRE))
|
|
|
+ if (bss->hold ||
|
|
|
+ !time_after(jiffies, bss->ts + IEEE80211_SCAN_RESULT_EXPIRE))
|
|
|
continue;
|
|
|
list_del(&bss->list);
|
|
|
rb_erase(&bss->rbn, &dev->bss_tree);
|
|
@@ -471,6 +472,30 @@ void cfg80211_unlink_bss(struct wiphy *wiphy, struct cfg80211_bss *pub)
|
|
|
}
|
|
|
EXPORT_SYMBOL(cfg80211_unlink_bss);
|
|
|
|
|
|
+void cfg80211_hold_bss(struct cfg80211_bss *pub)
|
|
|
+{
|
|
|
+ struct cfg80211_internal_bss *bss;
|
|
|
+
|
|
|
+ if (!pub)
|
|
|
+ return;
|
|
|
+
|
|
|
+ bss = container_of(pub, struct cfg80211_internal_bss, pub);
|
|
|
+ bss->hold = true;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(cfg80211_hold_bss);
|
|
|
+
|
|
|
+void cfg80211_unhold_bss(struct cfg80211_bss *pub)
|
|
|
+{
|
|
|
+ struct cfg80211_internal_bss *bss;
|
|
|
+
|
|
|
+ if (!pub)
|
|
|
+ return;
|
|
|
+
|
|
|
+ bss = container_of(pub, struct cfg80211_internal_bss, pub);
|
|
|
+ bss->hold = false;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(cfg80211_unhold_bss);
|
|
|
+
|
|
|
#ifdef CONFIG_WIRELESS_EXT
|
|
|
int cfg80211_wext_siwscan(struct net_device *dev,
|
|
|
struct iw_request_info *info,
|