Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mac80211: Stop TX BA session if buf_size is zero

If we receive an ADDBA response with status code 0 and a buf_size of 0
we should stop the TX BA session as otherwise we'll end up queuing
frames in ieee80211_tx_prep_agg forever instead of sending them out as
non AMPDUs.

This fixes a problem with AVM Fritz Stick N wireless devices where
frames to this device are not transmitted anymore by mac80211.

Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
Acked-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

authored by

Helmut Schaa and committed by
John W. Linville
3ca97880 191d6a8c

+7 -11
+7 -11
net/mac80211/agg-tx.c
··· 777 777 #ifdef CONFIG_MAC80211_HT_DEBUG 778 778 printk(KERN_DEBUG "switched off addBA timer for tid %d\n", tid); 779 779 #endif 780 - 780 + /* 781 + * IEEE 802.11-2007 7.3.1.14: 782 + * In an ADDBA Response frame, when the Status Code field 783 + * is set to 0, the Buffer Size subfield is set to a value 784 + * of at least 1. 785 + */ 781 786 if (le16_to_cpu(mgmt->u.action.u.addba_resp.status) 782 - == WLAN_STATUS_SUCCESS) { 783 - /* 784 - * IEEE 802.11-2007 7.3.1.14: 785 - * In an ADDBA Response frame, when the Status Code field 786 - * is set to 0, the Buffer Size subfield is set to a value 787 - * of at least 1. 788 - */ 789 - if (!buf_size) 790 - goto out; 791 - 787 + == WLAN_STATUS_SUCCESS && buf_size) { 792 788 if (test_and_set_bit(HT_AGG_STATE_RESPONSE_RECEIVED, 793 789 &tid_tx->state)) { 794 790 /* ignore duplicate response */