mac80211: assure that certain drivers adhere to DONT_REORDER flag
authorMathy Vanhoef <Mathy.Vanhoef@kuleuven.be>
Wed, 4 Nov 2020 06:18:22 +0000 (10:18 +0400)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 6 Nov 2020 10:03:43 +0000 (11:03 +0100)
Some drivers use skb->priority to determine on which queue to send
a frame. An example is mt76x2u (this was tested on an AWUS036ACM).
This means these drivers currently do not adhere to the DONT_REORDER
flag. To fix this, we do not set skb->priority based on the QoS TID
of injected frames when the DONT_REORDER flag is set.

Signed-off-by: Mathy Vanhoef <Mathy.Vanhoef@kuleuven.be>
Link: https://lore.kernel.org/r/20201104061823.197407-5-Mathy.Vanhoef@kuleuven.be
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/tx.c

index 8bf80b6757dcc19818c71ec2266c9fdcde84fd4a..1651cf7b25003e80c48f0677999d5c662402263e 100644 (file)
@@ -2271,8 +2271,13 @@ netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb,
                                                    payload[7]);
        }
 
-       /* Initialize skb->priority for QoS frames */
-       if (ieee80211_is_data_qos(hdr->frame_control)) {
+       /* Initialize skb->priority for QoS frames. If the DONT_REORDER flag
+        * is set, stick to the default value for skb->priority to assure
+        * frames injected with this flag are not reordered relative to each
+        * other.
+        */
+       if (ieee80211_is_data_qos(hdr->frame_control) &&
+           !(info->control.flags & IEEE80211_TX_CTRL_DONT_REORDER)) {
                u8 *p = ieee80211_get_qos_ctl(hdr);
                skb->priority = *p & IEEE80211_QOS_CTL_TAG1D_MASK;
        }