diff options
author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2012-04-23 17:29:29 +0000 |
---|---|---|
committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2012-04-23 17:29:29 +0000 |
commit | e8bb79e1007eb666b5ff38e6033ed1a7e9cda90d (patch) | |
tree | 5a8a19f02838e29c0da5e5c9f14242091bdb8321 /package/mac80211/patches/300-pending_work.patch | |
parent | 81896ccacbf423ff608e523705a75bf839306bfd (diff) |
mac80211: update AP multicast fix to latest version submitted to linux-wireless@
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@31453 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/mac80211/patches/300-pending_work.patch')
-rw-r--r-- | package/mac80211/patches/300-pending_work.patch | 48 |
1 files changed, 40 insertions, 8 deletions
diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch index 0ffa61d4d..79d8277ed 100644 --- a/package/mac80211/patches/300-pending_work.patch +++ b/package/mac80211/patches/300-pending_work.patch @@ -814,13 +814,38 @@ 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); } @@ -858,20 +883,27 @@ }; --- 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; |