Skip to content

Commit

Permalink
cfg80211: track hidden SSID networks properly
Browse files Browse the repository at this point in the history
Currently, cfg80211 will copy beacon IEs from a previously
received hidden SSID beacon to a probe response entry, if
that entry is created after the beacon entry. However, if
it is the other way around, or if the beacon is updated,
such changes aren't propagated.

Fix this by tracking the relation between the probe
response and beacon BSS structs in this case.

In case drivers have private data stored in a BSS struct
and need access to such data from a beacon entry, cfg80211
now provides the hidden_beacon_bss pointer from the probe
response entry to the beacon entry.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  • Loading branch information
Johannes Berg committed Feb 11, 2013
1 parent 1f4ac5a commit 776b358
Show file tree
Hide file tree
Showing 3 changed files with 232 additions and 54 deletions.
9 changes: 9 additions & 0 deletions include/net/cfg80211.h
Original file line number Diff line number Diff line change
Expand Up @@ -1292,7 +1292,14 @@ struct cfg80211_bss_ies {
* either the beacon_ies or proberesp_ies depending on whether Probe
* Response frame has been received
* @beacon_ies: the information elements from the last Beacon frame
* (implementation note: if @hidden_beacon_bss is set this struct doesn't
* own the beacon_ies, but they're just pointers to the ones from the
* @hidden_beacon_bss struct)
* @proberesp_ies: the information elements from the last Probe Response frame
* @hidden_beacon_bss: in case this BSS struct represents a probe response from
* a BSS that hides the SSID in its beacon, this points to the BSS struct
* that holds the beacon data. @beacon_ies is still valid, of course, and
* points to the same data as hidden_beacon_bss->beacon_ies in that case.
* @signal: signal strength value (type depends on the wiphy's signal_type)
* @priv: private area for driver use, has at least wiphy->bss_priv_size bytes
*/
Expand All @@ -1305,6 +1312,8 @@ struct cfg80211_bss {
const struct cfg80211_bss_ies __rcu *beacon_ies;
const struct cfg80211_bss_ies __rcu *proberesp_ies;

struct cfg80211_bss *hidden_beacon_bss;

s32 signal;

u16 beacon_interval;
Expand Down
4 changes: 2 additions & 2 deletions net/wireless/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
#include <linux/mutex.h>
#include <linux/list.h>
#include <linux/netdevice.h>
#include <linux/kref.h>
#include <linux/rbtree.h>
#include <linux/debugfs.h>
#include <linux/rfkill.h>
Expand Down Expand Up @@ -124,9 +123,10 @@ static inline void assert_cfg80211_lock(void)

struct cfg80211_internal_bss {
struct list_head list;
struct list_head hidden_list;
struct rb_node rbn;
unsigned long ts;
struct kref ref;
unsigned long refcount;
atomic_t hold;

/* must be last because of priv member */
Expand Down
Loading

0 comments on commit 776b358

Please sign in to comment.