mac80211: upgrade to a new unofficial snapshot based on wireless-testing+wireless-2.6
[openwrt-10.03/.git] / package / mac80211 / patches / 550-vlan_sta_lookup.patch
diff --git a/package/mac80211/patches/550-vlan_sta_lookup.patch b/package/mac80211/patches/550-vlan_sta_lookup.patch
new file mode 100644 (file)
index 0000000..ad15ca9
--- /dev/null
@@ -0,0 +1,98 @@
+--- a/net/mac80211/sta_info.c
++++ b/net/mac80211/sta_info.c
+@@ -119,6 +119,27 @@ struct sta_info *sta_info_get(struct iee
+       return sta;
+ }
++/*
++ * Get sta info either from the specified interface
++ * or from one of its vlans
++ */
++struct sta_info *sta_info_get_bss(struct ieee80211_sub_if_data *sdata,
++                                const u8 *addr)
++{
++      struct ieee80211_local *local = sdata->local;
++      struct sta_info *sta;
++
++      sta = rcu_dereference(local->sta_hash[STA_HASH(addr)]);
++      while (sta) {
++              if ((sta->sdata == sdata ||
++                   sta->sdata->bss == sdata->bss) &&
++                  memcmp(sta->sta.addr, addr, ETH_ALEN) == 0)
++                      break;
++              sta = rcu_dereference(sta->hnext);
++      }
++      return sta;
++}
++
+ struct sta_info *sta_info_get_by_idx(struct ieee80211_sub_if_data *sdata,
+                                    int idx)
+ {
+--- a/net/mac80211/sta_info.h
++++ b/net/mac80211/sta_info.h
+@@ -408,6 +408,9 @@ static inline u32 get_sta_flags(struct s
+ struct sta_info *sta_info_get(struct ieee80211_sub_if_data *sdata,
+                             const u8 *addr);
++struct sta_info *sta_info_get_bss(struct ieee80211_sub_if_data *sdata,
++                                const u8 *addr);
++
+ static inline
+ void for_each_sta_info_type_check(struct ieee80211_local *local,
+                                 const u8 *addr,
+--- a/net/mac80211/cfg.c
++++ b/net/mac80211/cfg.c
+@@ -148,7 +148,7 @@ static int ieee80211_add_key(struct wiph
+       rcu_read_lock();
+       if (mac_addr) {
+-              sta = sta_info_get(sdata, mac_addr);
++              sta = sta_info_get_bss(sdata, mac_addr);
+               if (!sta) {
+                       ieee80211_key_free(key);
+                       err = -ENOENT;
+@@ -179,7 +179,7 @@ static int ieee80211_del_key(struct wiph
+       if (mac_addr) {
+               ret = -ENOENT;
+-              sta = sta_info_get(sdata, mac_addr);
++              sta = sta_info_get_bss(sdata, mac_addr);
+               if (!sta)
+                       goto out_unlock;
+@@ -226,7 +226,7 @@ static int ieee80211_get_key(struct wiph
+       rcu_read_lock();
+       if (mac_addr) {
+-              sta = sta_info_get(sdata, mac_addr);
++              sta = sta_info_get_bss(sdata, mac_addr);
+               if (!sta)
+                       goto out;
+@@ -419,7 +419,7 @@ static int ieee80211_get_station(struct 
+       rcu_read_lock();
+-      sta = sta_info_get(sdata, mac);
++      sta = sta_info_get_bss(sdata, mac);
+       if (sta) {
+               ret = 0;
+               sta_set_sinfo(sta, sinfo);
+@@ -775,7 +775,7 @@ static int ieee80211_del_station(struct 
+       if (mac) {
+               rcu_read_lock();
+-              sta = sta_info_get(sdata, mac);
++              sta = sta_info_get_bss(sdata, mac);
+               if (!sta) {
+                       rcu_read_unlock();
+                       return -ENOENT;
+@@ -803,7 +803,7 @@ static int ieee80211_change_station(stru
+       rcu_read_lock();
+-      sta = sta_info_get(sdata, mac);
++      sta = sta_info_get_bss(sdata, mac);
+       if (!sta) {
+               rcu_read_unlock();
+               return -ENOENT;