mac80211: fix num_mcast_sta counting issues
[deliverable/linux.git] / net / mac80211 / sta_info.c
index 38137cb5f6f05877a6aadca7fcb846d0062df648..97a9d6639fb9c2b5846dd05cec95b8da99f23e9d 100644 (file)
@@ -1195,13 +1195,15 @@ ieee80211_sta_ps_deliver_response(struct sta_info *sta,
                            ieee80211_is_qos_nullfunc(hdr->frame_control))
                                qoshdr = ieee80211_get_qos_ctl(hdr);
 
-                       /* set EOSP for the frame */
-                       if (reason == IEEE80211_FRAME_RELEASE_UAPSD &&
-                           qoshdr && skb_queue_empty(&frames))
-                               *qoshdr |= IEEE80211_QOS_CTL_EOSP;
-
-                       info->flags |= IEEE80211_TX_STATUS_EOSP |
-                                      IEEE80211_TX_CTL_REQ_TX_STATUS;
+                       /* end service period after last frame */
+                       if (skb_queue_empty(&frames)) {
+                               if (reason == IEEE80211_FRAME_RELEASE_UAPSD &&
+                                   qoshdr)
+                                       *qoshdr |= IEEE80211_QOS_CTL_EOSP;
+
+                               info->flags |= IEEE80211_TX_STATUS_EOSP |
+                                              IEEE80211_TX_CTL_REQ_TX_STATUS;
+                       }
 
                        if (qoshdr)
                                tids |= BIT(*qoshdr & IEEE80211_QOS_CTL_TID_MASK);
@@ -1415,15 +1417,19 @@ int sta_info_move_state(struct sta_info *sta,
                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)
-                               atomic_dec(&sta->sdata->u.ap.num_sta_authorized);
+                       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)
-                               atomic_inc(&sta->sdata->u.ap.num_sta_authorized);
+                       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;
This page took 0.027923 seconds and 5 git commands to generate.