diff options
Diffstat (limited to 'net/mac80211/iface.c')
-rw-r--r-- | net/mac80211/iface.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index fe140bf033f9..edf21cebeee8 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c | |||
@@ -684,21 +684,25 @@ static u16 ieee80211_monitor_select_queue(struct net_device *dev, | |||
684 | struct ieee80211_local *local = sdata->local; | 684 | struct ieee80211_local *local = sdata->local; |
685 | struct ieee80211_hdr *hdr; | 685 | struct ieee80211_hdr *hdr; |
686 | struct ieee80211_radiotap_header *rtap = (void *)skb->data; | 686 | struct ieee80211_radiotap_header *rtap = (void *)skb->data; |
687 | u8 *p; | ||
687 | 688 | ||
688 | if (local->hw.queues < 4) | 689 | if (local->hw.queues < 4) |
689 | return 0; | 690 | return 0; |
690 | 691 | ||
691 | if (skb->len < 4 || | 692 | if (skb->len < 4 || |
692 | skb->len < rtap->it_len + 2 /* frame control */) | 693 | skb->len < le16_to_cpu(rtap->it_len) + 2 /* frame control */) |
693 | return 0; /* doesn't matter, frame will be dropped */ | 694 | return 0; /* doesn't matter, frame will be dropped */ |
694 | 695 | ||
695 | hdr = (void *)((u8 *)skb->data + rtap->it_len); | 696 | hdr = (void *)((u8 *)skb->data + le16_to_cpu(rtap->it_len)); |
696 | 697 | ||
697 | if (!ieee80211_is_data(hdr->frame_control)) { | 698 | if (!ieee80211_is_data_qos(hdr->frame_control)) { |
698 | skb->priority = 7; | 699 | skb->priority = 7; |
699 | return ieee802_1d_to_ac[skb->priority]; | 700 | return ieee802_1d_to_ac[skb->priority]; |
700 | } | 701 | } |
701 | 702 | ||
703 | p = ieee80211_get_qos_ctl(hdr); | ||
704 | skb->priority = *p & IEEE80211_QOS_CTL_TAG1D_MASK; | ||
705 | |||
702 | return ieee80211_downgrade_queue(local, skb); | 706 | return ieee80211_downgrade_queue(local, skb); |
703 | } | 707 | } |
704 | 708 | ||