mac80211: remove sta TIM flag, fix expiry TIM handling
authorJohannes Berg <johannes@sipsolutions.net>
Wed, 20 Feb 2008 01:07:21 +0000 (02:07 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 29 Feb 2008 20:37:26 +0000 (15:37 -0500)
The TIM flag that is kept in each station's info is completely
useless, there's no code (aside from the debugfs display code)
checking it, hence it can be removed. While doing that, I noticed
that the TIM handling is broken when buffered frames expire, so
fix that.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/debugfs_sta.c
net/mac80211/rx.c
net/mac80211/sta_info.c
net/mac80211/sta_info.h
net/mac80211/tx.c

index ac61353ae7cedde1e2682629bc9d21da5b8cd00c..47db0d4aa433623c27ef904f55080576ef2ed92f 100644 (file)
@@ -74,11 +74,10 @@ static ssize_t sta_flags_read(struct file *file, char __user *userbuf,
 {
        char buf[100];
        struct sta_info *sta = file->private_data;
-       int res = scnprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s",
+       int res = scnprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s",
                sta->flags & WLAN_STA_AUTH ? "AUTH\n" : "",
                sta->flags & WLAN_STA_ASSOC ? "ASSOC\n" : "",
                sta->flags & WLAN_STA_PS ? "PS\n" : "",
-               sta->flags & WLAN_STA_TIM ? "TIM\n" : "",
                sta->flags & WLAN_STA_AUTHORIZED ? "AUTHORIZED\n" : "",
                sta->flags & WLAN_STA_SHORT_PREAMBLE ? "SHORT PREAMBLE\n" : "",
                sta->flags & WLAN_STA_WME ? "WME\n" : "",
index af606f7150166c80edc95b2810bdc56693d9e563..0e8a371496b3d1308ba11e06cb3d46741e5c24b5 100644 (file)
@@ -598,7 +598,7 @@ static int ap_sta_ps_end(struct net_device *dev, struct sta_info *sta)
        sdata = IEEE80211_DEV_TO_SUB_IF(sta->dev);
        if (sdata->bss)
                atomic_dec(&sdata->bss->num_sta_ps);
-       sta->flags &= ~(WLAN_STA_PS | WLAN_STA_TIM | WLAN_STA_PSPOLL);
+       sta->flags &= ~(WLAN_STA_PS | WLAN_STA_PSPOLL);
        if (!skb_queue_empty(&sta->ps_tx_buf)) {
                if (sdata->bss)
                        bss_tim_clear(local, sdata->bss, sta->aid);
@@ -938,10 +938,9 @@ ieee80211_rx_h_ps_poll(struct ieee80211_txrx_data *rx)
 
                /* Use MoreData flag to indicate whether there are more
                 * buffered frames for this STA */
-               if (no_pending_pkts) {
+               if (no_pending_pkts)
                        hdr->frame_control &= cpu_to_le16(~IEEE80211_FCTL_MOREDATA);
-                       rx->sta->flags &= ~WLAN_STA_TIM;
-               } else
+               else
                        hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_MOREDATA);
 
                dev_queue_xmit(skb);
index cbe00979e44430237a367ee00c9204980c457489..a843bb7dd2d3301734d7fe9d2beec76017ed6974 100644 (file)
@@ -286,6 +286,7 @@ static void sta_info_cleanup_expire_buffered(struct ieee80211_local *local,
 {
        unsigned long flags;
        struct sk_buff *skb;
+       struct ieee80211_sub_if_data *sdata;
        DECLARE_MAC_BUF(mac);
 
        if (skb_queue_empty(&sta->ps_tx_buf))
@@ -294,21 +295,28 @@ static void sta_info_cleanup_expire_buffered(struct ieee80211_local *local,
        for (;;) {
                spin_lock_irqsave(&sta->ps_tx_buf.lock, flags);
                skb = skb_peek(&sta->ps_tx_buf);
-               if (sta_info_buffer_expired(local, sta, skb)) {
+               if (sta_info_buffer_expired(local, sta, skb))
                        skb = __skb_dequeue(&sta->ps_tx_buf);
-                       if (skb_queue_empty(&sta->ps_tx_buf))
-                               sta->flags &= ~WLAN_STA_TIM;
-               } else
+               else
                        skb = NULL;
                spin_unlock_irqrestore(&sta->ps_tx_buf.lock, flags);
 
-               if (skb) {
-                       local->total_ps_buffered--;
-                       printk(KERN_DEBUG "Buffered frame expired (STA "
-                              "%s)\n", print_mac(mac, sta->addr));
-                       dev_kfree_skb(skb);
-               } else
+               if (!skb)
                        break;
+
+               sdata = IEEE80211_DEV_TO_SUB_IF(sta->dev);
+               local->total_ps_buffered--;
+               printk(KERN_DEBUG "Buffered frame expired (STA "
+                      "%s)\n", print_mac(mac, sta->addr));
+               dev_kfree_skb(skb);
+
+               if (skb_queue_empty(&sta->ps_tx_buf)) {
+                       if (sdata->bss)
+                               bss_tim_set(sta->local, sdata->bss, sta->aid);
+                       if (sta->local->ops->set_tim)
+                               sta->local->ops->set_tim(local_to_hw(sta->local),
+                                                        sta->aid, 0);
+               }
        }
 }
 
index ca51d29b70081b10509a26912d7ce7a9cdcfc70c..f3d9f872db4a87b57b86287ada4e87e70e829b8b 100644 (file)
@@ -23,7 +23,6 @@
  * @WLAN_STA_AUTH: Station is authenticated.
  * @WLAN_STA_ASSOC: Station is associated.
  * @WLAN_STA_PS: Station is in power-save mode
- * @WLAN_STA_TIM: TIM bit is on for this PS station (traffic buffered)
  * @WLAN_STA_AUTHORIZED: Station is authorized to send/receive traffic.
  *     This bit is always checked so needs to be enabled for all stations
  *     when virtual port control is not in use.
@@ -38,13 +37,12 @@ enum ieee80211_sta_info_flags {
        WLAN_STA_AUTH           = 1<<0,
        WLAN_STA_ASSOC          = 1<<1,
        WLAN_STA_PS             = 1<<2,
-       WLAN_STA_TIM            = 1<<3,
-       WLAN_STA_AUTHORIZED     = 1<<4,
-       WLAN_STA_SHORT_PREAMBLE = 1<<5,
-       WLAN_STA_ASSOC_AP       = 1<<6,
-       WLAN_STA_WME            = 1<<7,
-       WLAN_STA_WDS            = 1<<8,
-       WLAN_STA_PSPOLL         = 1<<9,
+       WLAN_STA_AUTHORIZED     = 1<<3,
+       WLAN_STA_SHORT_PREAMBLE = 1<<4,
+       WLAN_STA_ASSOC_AP       = 1<<5,
+       WLAN_STA_WME            = 1<<6,
+       WLAN_STA_WDS            = 1<<7,
+       WLAN_STA_PSPOLL         = 1<<8,
 };
 
 #define STA_TID_NUM 16
index 82474a8f251bffb8e3ef1306e1f357a057ce97d6..db6a871b51ed248fe363b9f51938f457cbc4e22b 100644 (file)
@@ -404,7 +404,6 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_txrx_data *tx)
                       print_mac(mac, sta->addr), sta->aid,
                       skb_queue_len(&sta->ps_tx_buf));
 #endif /* CONFIG_MAC80211_VERBOSE_PS_DEBUG */
-               sta->flags |= WLAN_STA_TIM;
                if (tx->local->total_ps_buffered >= TOTAL_MAX_TX_BUFFER)
                        purge_old_ps_buffers(tx->local);
                if (skb_queue_len(&sta->ps_tx_buf) >= STA_MAX_TX_BUFFER) {