Skip to content

Commit 859ae70

Browse files
nscndjmberg-intel
authored andcommitted
mac80211: fix forwarded mesh frames AC & queue selection
There are two problems with the current code that have been highlighted with the AQL feature that is now enbaled by default. First problem is in ieee80211_rx_h_mesh_fwding(), ieee80211_select_queue_80211() is used on received packets to choose the sending AC queue of the forwarding packet although this function should only be called on TX packet (it uses ieee80211_tx_info). This ends with forwarded mesh packets been sent on unrelated random AC queue. To fix that, AC queue can directly be infered from skb->priority which has been extracted from QOS info (see ieee80211_parse_qos()). Second problem is the value of queue_mapping set on forwarded mesh frames via skb_set_queue_mapping() is not the AC of the packet but a hardware queue index. This may or may not work depending on AC to HW queue mapping which is driver specific. Both of these issues lead to improper AC selection while forwarding mesh packets but more importantly due to improper airtime accounting (which is done on a per STA, per AC basis) caused traffic stall with the introduction of AQL. Fixes: cf44012 ("mac80211: fix unnecessary frame drops in mesh fwding") Fixes: d3c1597 ("mac80211: fix forwarded mesh frame queue mapping") Co-developed-by: Remi Pommarel <[email protected]> Signed-off-by: Remi Pommarel <[email protected]> Signed-off-by: Nicolas Escande <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Johannes Berg <[email protected]>
1 parent a6bce78 commit 859ae70

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

net/mac80211/rx.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2923,13 +2923,13 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
29232923
ether_addr_equal(sdata->vif.addr, hdr->addr3))
29242924
return RX_CONTINUE;
29252925

2926-
ac = ieee80211_select_queue_80211(sdata, skb, hdr);
2926+
ac = ieee802_1d_to_ac[skb->priority];
29272927
q = sdata->vif.hw_queue[ac];
29282928
if (ieee80211_queue_stopped(&local->hw, q)) {
29292929
IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_congestion);
29302930
return RX_DROP_MONITOR;
29312931
}
2932-
skb_set_queue_mapping(skb, q);
2932+
skb_set_queue_mapping(skb, ac);
29332933

29342934
if (!--mesh_hdr->ttl) {
29352935
if (!is_multicast_ether_addr(hdr->addr1))

0 commit comments

Comments
 (0)