mac80211: update AP multicast fix to latest version submitted to linux-wireless@
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Mon, 23 Apr 2012 17:29:29 +0000 (17:29 +0000)
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Mon, 23 Apr 2012 17:29:29 +0000 (17:29 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@31453 3c298f89-4303-0410-b956-a3cf2f4a3e73

package/mac80211/patches/300-pending_work.patch
package/mac80211/patches/520-mac80211_cur_txpower.patch
package/mac80211/patches/550-mac80211_optimize_mcs_rate_mask.patch

index 0ffa61d..79d8277 100644 (file)
                 ATH9K_RXERR_KEYMISS));
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -1023,6 +1023,10 @@ static int ieee80211_change_station(stru
+@@ -1005,6 +1005,9 @@ static int ieee80211_change_station(stru
+       }
+       if (params->vlan && params->vlan != sta->sdata->dev) {
++              bool prev_4addr = false;
++              bool new_4addr = false;
++
+               vlansdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
+               if (vlansdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
+@@ -1020,9 +1023,25 @@ static int ieee80211_change_station(stru
+                       }
+                       rcu_assign_pointer(vlansdata->u.vlan.sta, sta);
++                      new_4addr = true;
++              }
++
++              if (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
++                  sta->sdata->u.vlan.sta) {
++                      rcu_assign_pointer(sta->sdata->u.vlan.sta, NULL);
++                      prev_4addr = true;
                }
  
                sta->sdata = vlansdata;
 +
-+              if (sta->sta_state == IEEE80211_STA_AUTHORIZED)
-+                      atomic_dec(&sta->sdata->u.ap.num_mcast_sta);
++              if (sta->sta_state == IEEE80211_STA_AUTHORIZED &&
++                  prev_4addr != new_4addr) {
++                      if (new_4addr)
++                              atomic_dec(&sta->sdata->bss->num_mcast_sta);
++                      else
++                              atomic_inc(&sta->sdata->bss->num_mcast_sta);
++              }
 +
                ieee80211_send_layer2_update(sta);
        }
  };
 --- a/net/mac80211/sta_info.c
 +++ b/net/mac80211/sta_info.c
-@@ -1418,14 +1418,14 @@ int sta_info_move_state(struct sta_info 
+@@ -1417,15 +1417,19 @@ int sta_info_move_state(struct sta_info 
+               if (sta->sta_state == IEEE80211_STA_AUTH) {
                        set_bit(WLAN_STA_ASSOC, &sta->_flags);
                } else if (sta->sta_state == IEEE80211_STA_AUTHORIZED) {
-                       if (sta->sdata->vif.type == NL80211_IFTYPE_AP)
+-                      if (sta->sdata->vif.type == NL80211_IFTYPE_AP)
 -                              atomic_dec(&sta->sdata->u.ap.num_sta_authorized);
-+                              atomic_dec(&sta->sdata->u.ap.num_mcast_sta);
++                      if (sta->sdata->vif.type == NL80211_IFTYPE_AP ||
++                          (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
++                           !sta->sdata->u.vlan.sta))
++                              atomic_dec(&sta->sdata->bss->num_mcast_sta);
                        clear_bit(WLAN_STA_AUTHORIZED, &sta->_flags);
                }
                break;
        case IEEE80211_STA_AUTHORIZED:
                if (sta->sta_state == IEEE80211_STA_ASSOC) {
-                       if (sta->sdata->vif.type == NL80211_IFTYPE_AP)
+-                      if (sta->sdata->vif.type == NL80211_IFTYPE_AP)
 -                              atomic_inc(&sta->sdata->u.ap.num_sta_authorized);
-+                              atomic_inc(&sta->sdata->u.ap.num_mcast_sta);
++                      if (sta->sdata->vif.type == NL80211_IFTYPE_AP ||
++                          (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
++                           !sta->sdata->u.vlan.sta))
++                              atomic_inc(&sta->sdata->bss->num_mcast_sta);
                        set_bit(WLAN_STA_AUTHORIZED, &sta->_flags);
                }
                break;
index 66dadf8..f1bd0bc 100644 (file)
@@ -11,7 +11,7 @@
        u16 listen_interval;
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -1742,7 +1742,7 @@ static int ieee80211_get_tx_power(struct
+@@ -1757,7 +1757,7 @@ static int ieee80211_get_tx_power(struct
  {
        struct ieee80211_local *local = wiphy_priv(wiphy);
  
index 972262a..a7e1fc1 100644 (file)
@@ -11,7 +11,7 @@
        union {
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -1918,9 +1918,20 @@ static int ieee80211_set_bitrate_mask(st
+@@ -1933,9 +1933,20 @@ static int ieee80211_set_bitrate_mask(st
        }
  
        for (i = 0; i < IEEE80211_NUM_BANDS; i++) {