|
@@ -1276,11 +1276,6 @@ static void ieee80211_set_skb_enqueue_time(struct sk_buff *skb)
|
|
|
IEEE80211_SKB_CB(skb)->control.enqueue_time = codel_get_time();
|
|
|
}
|
|
|
|
|
|
-static void ieee80211_set_skb_vif(struct sk_buff *skb, struct txq_info *txqi)
|
|
|
-{
|
|
|
- IEEE80211_SKB_CB(skb)->control.vif = txqi->txq.vif;
|
|
|
-}
|
|
|
-
|
|
|
static u32 codel_skb_len_func(const struct sk_buff *skb)
|
|
|
{
|
|
|
return skb->len;
|
|
@@ -3414,6 +3409,7 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,
|
|
|
struct ieee80211_tx_info *info;
|
|
|
struct ieee80211_tx_data tx;
|
|
|
ieee80211_tx_result r;
|
|
|
+ struct ieee80211_vif *vif;
|
|
|
|
|
|
spin_lock_bh(&fq->lock);
|
|
|
|
|
@@ -3430,8 +3426,6 @@ begin:
|
|
|
if (!skb)
|
|
|
goto out;
|
|
|
|
|
|
- ieee80211_set_skb_vif(skb, txqi);
|
|
|
-
|
|
|
hdr = (struct ieee80211_hdr *)skb->data;
|
|
|
info = IEEE80211_SKB_CB(skb);
|
|
|
|
|
@@ -3488,6 +3482,34 @@ begin:
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ switch (tx.sdata->vif.type) {
|
|
|
+ case NL80211_IFTYPE_MONITOR:
|
|
|
+ if (tx.sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) {
|
|
|
+ vif = &tx.sdata->vif;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ tx.sdata = rcu_dereference(local->monitor_sdata);
|
|
|
+ if (tx.sdata) {
|
|
|
+ vif = &tx.sdata->vif;
|
|
|
+ info->hw_queue =
|
|
|
+ vif->hw_queue[skb_get_queue_mapping(skb)];
|
|
|
+ } else if (ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) {
|
|
|
+ ieee80211_free_txskb(&local->hw, skb);
|
|
|
+ goto begin;
|
|
|
+ } else {
|
|
|
+ vif = NULL;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case NL80211_IFTYPE_AP_VLAN:
|
|
|
+ tx.sdata = container_of(tx.sdata->bss,
|
|
|
+ struct ieee80211_sub_if_data, u.ap);
|
|
|
+ /* fall through */
|
|
|
+ default:
|
|
|
+ vif = &tx.sdata->vif;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ IEEE80211_SKB_CB(skb)->control.vif = vif;
|
|
|
out:
|
|
|
spin_unlock_bh(&fq->lock);
|
|
|
|