aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/iface.c
diff options
context:
space:
mode:
authorThomas Pedersen <thomas@cozybit.com>2011-11-24 20:15:23 -0500
committerJohn W. Linville <linville@tuxdriver.com>2011-11-28 14:44:05 -0500
commitd3c1597b8d1ba0447ce858c7c385eabcf69f2c8f (patch)
tree8cb77c385088aadf240d270f1c854d72d4193c52 /net/mac80211/iface.c
parent3c26f1f68e24d087cd3481aeb68a6274e6e0b30b (diff)
mac80211: fix forwarded mesh frame queue mapping
We can't rely on ieee80211_select_queue() to do its job at this point since the skb->protocol is not yet known. Instead, factor out and reuse the queue mapping logic for injected frames. Also, to mitigate congestion, forwarded frames should be dropped if the outgoing queue was stopped. This was not correctly implemented as we were not checking the right queue. Furthermore, we were dropping frames that had arrived to their destination if that queue was stopped. Signed-off-by: Thomas Pedersen <thomas@cozybit.com> Signed-off-by: Javier Cardona <javier@cozybit.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/iface.c')
-rw-r--r--net/mac80211/iface.c15
1 files changed, 1 insertions, 14 deletions
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index be1d61e76e93..3d3bb5e9d8fa 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -672,7 +672,6 @@ static u16 ieee80211_monitor_select_queue(struct net_device *dev,
672 struct ieee80211_local *local = sdata->local; 672 struct ieee80211_local *local = sdata->local;
673 struct ieee80211_hdr *hdr; 673 struct ieee80211_hdr *hdr;
674 struct ieee80211_radiotap_header *rtap = (void *)skb->data; 674 struct ieee80211_radiotap_header *rtap = (void *)skb->data;
675 u8 *p;
676 675
677 if (local->hw.queues < 4) 676 if (local->hw.queues < 4)
678 return 0; 677 return 0;
@@ -683,19 +682,7 @@ static u16 ieee80211_monitor_select_queue(struct net_device *dev,
683 682
684 hdr = (void *)((u8 *)skb->data + le16_to_cpu(rtap->it_len)); 683 hdr = (void *)((u8 *)skb->data + le16_to_cpu(rtap->it_len));
685 684
686 if (!ieee80211_is_data(hdr->frame_control)) { 685 return ieee80211_select_queue_80211(local, skb, hdr);
687 skb->priority = 7;
688 return ieee802_1d_to_ac[skb->priority];
689 }
690 if (!ieee80211_is_data_qos(hdr->frame_control)) {
691 skb->priority = 0;
692 return ieee802_1d_to_ac[skb->priority];
693 }
694
695 p = ieee80211_get_qos_ctl(hdr);
696 skb->priority = *p & IEEE80211_QOS_CTL_TAG1D_MASK;
697
698 return ieee80211_downgrade_queue(local, skb);
699} 686}
700 687
701static const struct net_device_ops ieee80211_monitorif_ops = { 688static const struct net_device_ops ieee80211_monitorif_ops = {