Merge tag 'wireless-drivers-next-2020-12-12' of git://git.kernel.org/pub/scm/linux...
[linux-2.6-microblaze.git] / net / mac80211 / wme.c
index 2fb9932..9ea6004 100644 (file)
@@ -118,9 +118,11 @@ u16 ieee80211_select_queue_80211(struct ieee80211_sub_if_data *sdata,
                                 struct ieee80211_hdr *hdr)
 {
        struct ieee80211_local *local = sdata->local;
+       struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
        u8 *p;
 
-       if (local->hw.queues < IEEE80211_NUM_ACS)
+       if ((info->control.flags & IEEE80211_TX_CTRL_DONT_REORDER) ||
+           local->hw.queues < IEEE80211_NUM_ACS)
                return 0;
 
        if (!ieee80211_is_data(hdr->frame_control)) {
@@ -141,6 +143,7 @@ u16 ieee80211_select_queue_80211(struct ieee80211_sub_if_data *sdata,
 u16 __ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
                             struct sta_info *sta, struct sk_buff *skb)
 {
+       struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
        struct mac80211_qos_map *qos_map;
        bool qos;
 
@@ -153,7 +156,7 @@ u16 __ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
        else
                qos = false;
 
-       if (!qos) {
+       if (!qos || (info->control.flags & IEEE80211_TX_CTRL_DONT_REORDER)) {
                skb->priority = 0; /* required for correct WPA/11i MIC */
                return IEEE80211_AC_BE;
        }
@@ -202,9 +205,6 @@ u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
        case NL80211_IFTYPE_AP:
                ra = skb->data;
                break;
-       case NL80211_IFTYPE_WDS:
-               ra = sdata->u.wds.remote_addr;
-               break;
        case NL80211_IFTYPE_STATION:
                /* might be a TDLS station */
                sta = sta_info_get(sdata, skb->data);
@@ -249,6 +249,14 @@ void ieee80211_set_qos_hdr(struct ieee80211_sub_if_data *sdata,
 
        p = ieee80211_get_qos_ctl(hdr);
 
+       /* don't overwrite the QoS field of injected frames */
+       if (info->flags & IEEE80211_TX_CTL_INJECTED) {
+               /* do take into account Ack policy of injected frames */
+               if (*p & IEEE80211_QOS_CTL_ACK_POLICY_NOACK)
+                       info->flags |= IEEE80211_TX_CTL_NO_ACK;
+               return;
+       }
+
        /* set up the first byte */
 
        /*