aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHelmut Schaa <helmut.schaa@googlemail.com>2011-12-15 04:18:34 -0500
committerJohn W. Linville <linville@tuxdriver.com>2011-12-15 14:46:35 -0500
commitcf6bb79ad8287cd9fe8783aa8c9afdc9f6799657 (patch)
tree771c8d4bfe3e2dc760210ef3672e709c67275d08
parent4d33960bf9fa2c0ee82ba7120e7b56c766dd3a86 (diff)
mac80211: Use appropriate TID for sending BAR, ADDBA and DELBA frames
Currently BAR, ADDBA and DELBA frames are always sent using AC_VO. If the TID for which a BA session is established is assigned to a different queue BAR, ADDBA and DELBA frames can "overtake" frames of the according BA session. Hence, always put BA session related frames into the same queue as the BA sessions data frames. Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--net/mac80211/agg-tx.c4
-rw-r--r--net/mac80211/ht.c2
-rw-r--r--net/mac80211/ieee80211_i.h11
-rw-r--r--net/mac80211/tx.c8
4 files changed, 17 insertions, 8 deletions
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
index 88754c067f1..e92f98d3274 100644
--- a/net/mac80211/agg-tx.c
+++ b/net/mac80211/agg-tx.c
@@ -107,7 +107,7 @@ static void ieee80211_send_addba_request(struct ieee80211_sub_if_data *sdata,
107 mgmt->u.action.u.addba_req.start_seq_num = 107 mgmt->u.action.u.addba_req.start_seq_num =
108 cpu_to_le16(start_seq_num << 4); 108 cpu_to_le16(start_seq_num << 4);
109 109
110 ieee80211_tx_skb(sdata, skb); 110 ieee80211_tx_skb_tid(sdata, skb, tid);
111} 111}
112 112
113void ieee80211_send_bar(struct ieee80211_vif *vif, u8 *ra, u16 tid, u16 ssn) 113void ieee80211_send_bar(struct ieee80211_vif *vif, u8 *ra, u16 tid, u16 ssn)
@@ -136,7 +136,7 @@ void ieee80211_send_bar(struct ieee80211_vif *vif, u8 *ra, u16 tid, u16 ssn)
136 bar->start_seq_num = cpu_to_le16(ssn); 136 bar->start_seq_num = cpu_to_le16(ssn);
137 137
138 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; 138 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
139 ieee80211_tx_skb(sdata, skb); 139 ieee80211_tx_skb_tid(sdata, skb, tid);
140} 140}
141EXPORT_SYMBOL(ieee80211_send_bar); 141EXPORT_SYMBOL(ieee80211_send_bar);
142 142
diff --git a/net/mac80211/ht.c b/net/mac80211/ht.c
index 0fd9c2a7f24..f25fff7607d 100644
--- a/net/mac80211/ht.c
+++ b/net/mac80211/ht.c
@@ -300,7 +300,7 @@ void ieee80211_send_delba(struct ieee80211_sub_if_data *sdata,
300 mgmt->u.action.u.delba.params = cpu_to_le16(params); 300 mgmt->u.action.u.delba.params = cpu_to_le16(params);
301 mgmt->u.action.u.delba.reason_code = cpu_to_le16(reason_code); 301 mgmt->u.action.u.delba.reason_code = cpu_to_le16(reason_code);
302 302
303 ieee80211_tx_skb(sdata, skb); 303 ieee80211_tx_skb_tid(sdata, skb, tid);
304} 304}
305 305
306void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata, 306void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata,
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index 8e5b892834b..c3f3e431a57 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -1349,7 +1349,16 @@ void mac80211_ev_michael_mic_failure(struct ieee80211_sub_if_data *sdata, int ke
1349 gfp_t gfp); 1349 gfp_t gfp);
1350void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata); 1350void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata);
1351void ieee80211_xmit(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb); 1351void ieee80211_xmit(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb);
1352void ieee80211_tx_skb(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb); 1352
1353void ieee80211_tx_skb_tid(struct ieee80211_sub_if_data *sdata,
1354 struct sk_buff *skb, int tid);
1355static void inline ieee80211_tx_skb(struct ieee80211_sub_if_data *sdata,
1356 struct sk_buff *skb)
1357{
1358 /* Send all internal mgmt frames on VO. Accordingly set TID to 7. */
1359 ieee80211_tx_skb_tid(sdata, skb, 7);
1360}
1361
1353void ieee802_11_parse_elems(u8 *start, size_t len, 1362void ieee802_11_parse_elems(u8 *start, size_t len,
1354 struct ieee802_11_elems *elems); 1363 struct ieee802_11_elems *elems);
1355u32 ieee802_11_parse_elems_crc(u8 *start, size_t len, 1364u32 ieee802_11_parse_elems_crc(u8 *start, size_t len,
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index ab033fd00b7..edcd1c7ab83 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -2696,15 +2696,15 @@ ieee80211_get_buffered_bc(struct ieee80211_hw *hw,
2696} 2696}
2697EXPORT_SYMBOL(ieee80211_get_buffered_bc); 2697EXPORT_SYMBOL(ieee80211_get_buffered_bc);
2698 2698
2699void ieee80211_tx_skb(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb) 2699void ieee80211_tx_skb_tid(struct ieee80211_sub_if_data *sdata,
2700 struct sk_buff *skb, int tid)
2700{ 2701{
2701 skb_set_mac_header(skb, 0); 2702 skb_set_mac_header(skb, 0);
2702 skb_set_network_header(skb, 0); 2703 skb_set_network_header(skb, 0);
2703 skb_set_transport_header(skb, 0); 2704 skb_set_transport_header(skb, 0);
2704 2705
2705 /* Send all internal mgmt frames on VO. Accordingly set TID to 7. */ 2706 skb_set_queue_mapping(skb, ieee802_1d_to_ac[tid]);
2706 skb_set_queue_mapping(skb, IEEE80211_AC_VO); 2707 skb->priority = tid;
2707 skb->priority = 7;
2708 2708
2709 /* 2709 /*
2710 * The other path calling ieee80211_xmit is from the tasklet, 2710 * The other path calling ieee80211_xmit is from the tasklet,