diff options
author | Kalle Valo <kalle.valo@nokia.com> | 2009-03-22 15:57:28 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-03-27 20:13:13 -0400 |
commit | a08c1c1ac0c26229ca1ca45d554b209a56edc8be (patch) | |
tree | b49e2968fae2612ced8a090a659309b1300fe7cb /net | |
parent | 9050bdd8589c373e01e41ddbd9a192de2ff01ef0 (diff) |
cfg80211: add feature to hold bss
In beacon filtering there needs to be a way to not expire the BSS even
when no beacons are received. Add an interface to cfg80211 to hold
BSS and make sure that it's not expired.
Signed-off-by: Kalle Valo <kalle.valo@nokia.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/wireless/core.h | 2 | ||||
-rw-r--r-- | net/wireless/scan.c | 27 |
2 files changed, 28 insertions, 1 deletions
diff --git a/net/wireless/core.h b/net/wireless/core.h index 6acd483a61f8..97a6fd8b2b03 100644 --- a/net/wireless/core.h +++ b/net/wireless/core.h | |||
@@ -90,6 +90,8 @@ struct cfg80211_internal_bss { | |||
90 | struct rb_node rbn; | 90 | struct rb_node rbn; |
91 | unsigned long ts; | 91 | unsigned long ts; |
92 | struct kref ref; | 92 | struct kref ref; |
93 | bool hold; | ||
94 | |||
93 | /* must be last because of priv member */ | 95 | /* must be last because of priv member */ |
94 | struct cfg80211_bss pub; | 96 | struct cfg80211_bss pub; |
95 | }; | 97 | }; |
diff --git a/net/wireless/scan.c b/net/wireless/scan.c index 280dbcd02c15..2a00e362f5fe 100644 --- a/net/wireless/scan.c +++ b/net/wireless/scan.c | |||
@@ -80,7 +80,8 @@ void cfg80211_bss_expire(struct cfg80211_registered_device *dev) | |||
80 | bool expired = false; | 80 | bool expired = false; |
81 | 81 | ||
82 | list_for_each_entry_safe(bss, tmp, &dev->bss_list, list) { | 82 | list_for_each_entry_safe(bss, tmp, &dev->bss_list, list) { |
83 | if (!time_after(jiffies, bss->ts + IEEE80211_SCAN_RESULT_EXPIRE)) | 83 | if (bss->hold || |
84 | !time_after(jiffies, bss->ts + IEEE80211_SCAN_RESULT_EXPIRE)) | ||
84 | continue; | 85 | continue; |
85 | list_del(&bss->list); | 86 | list_del(&bss->list); |
86 | rb_erase(&bss->rbn, &dev->bss_tree); | 87 | rb_erase(&bss->rbn, &dev->bss_tree); |
@@ -471,6 +472,30 @@ void cfg80211_unlink_bss(struct wiphy *wiphy, struct cfg80211_bss *pub) | |||
471 | } | 472 | } |
472 | EXPORT_SYMBOL(cfg80211_unlink_bss); | 473 | EXPORT_SYMBOL(cfg80211_unlink_bss); |
473 | 474 | ||
475 | void cfg80211_hold_bss(struct cfg80211_bss *pub) | ||
476 | { | ||
477 | struct cfg80211_internal_bss *bss; | ||
478 | |||
479 | if (!pub) | ||
480 | return; | ||
481 | |||
482 | bss = container_of(pub, struct cfg80211_internal_bss, pub); | ||
483 | bss->hold = true; | ||
484 | } | ||
485 | EXPORT_SYMBOL(cfg80211_hold_bss); | ||
486 | |||
487 | void cfg80211_unhold_bss(struct cfg80211_bss *pub) | ||
488 | { | ||
489 | struct cfg80211_internal_bss *bss; | ||
490 | |||
491 | if (!pub) | ||
492 | return; | ||
493 | |||
494 | bss = container_of(pub, struct cfg80211_internal_bss, pub); | ||
495 | bss->hold = false; | ||
496 | } | ||
497 | EXPORT_SYMBOL(cfg80211_unhold_bss); | ||
498 | |||
474 | #ifdef CONFIG_WIRELESS_EXT | 499 | #ifdef CONFIG_WIRELESS_EXT |
475 | int cfg80211_wext_siwscan(struct net_device *dev, | 500 | int cfg80211_wext_siwscan(struct net_device *dev, |
476 | struct iw_request_info *info, | 501 | struct iw_request_info *info, |