mac80211: fix duration calculation for QoS NOACK frames
authorSimon Wunderlich <simon.wunderlich@s2003.tu-chemnitz.de>
Mon, 21 Nov 2011 20:34:30 +0000 (21:34 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 28 Nov 2011 19:36:21 +0000 (14:36 -0500)
Signed-off-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
Signed-off-by: Mathias Kretschmer <mathias.kretschmer@fokus.fraunhofer.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/tx.c

index 205fdcb70fff78eb638eb8b2ea6aabab314b2c39..a5ff02fbda8cff0e19ab29b8cbb5de37ecf880da 100644 (file)
@@ -151,11 +151,15 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,
                rate = mrate;
        }
 
-       /* Time needed to transmit ACK
-        * (10 bytes + 4-byte FCS = 112 bits) plus SIFS; rounded up
-        * to closest integer */
-
-       dur = ieee80211_frame_duration(local, 10, rate, erp,
+       /* Don't calculate ACKs for QoS Frames with NoAck Policy set */
+       if (ieee80211_is_data_qos(hdr->frame_control) &&
+           *(ieee80211_get_qos_ctl(hdr)) | IEEE80211_QOS_CTL_ACK_POLICY_NOACK)
+               dur = 0;
+       else
+               /* Time needed to transmit ACK
+                * (10 bytes + 4-byte FCS = 112 bits) plus SIFS; rounded up
+                * to closest integer */
+               dur = ieee80211_frame_duration(local, 10, rate, erp,
                                tx->sdata->vif.bss_conf.use_short_preamble);
 
        if (next_frag_len) {