|
@@ -10,6 +10,7 @@
|
|
|
#include <net/cfg80211.h>
|
|
|
#include <net/ip.h>
|
|
|
#include <net/dsfield.h>
|
|
|
+#include <linux/if_vlan.h>
|
|
|
#include "core.h"
|
|
|
#include "rdev-ops.h"
|
|
|
|
|
@@ -691,6 +692,7 @@ EXPORT_SYMBOL(ieee80211_amsdu_to_8023s);
|
|
|
unsigned int cfg80211_classify8021d(struct sk_buff *skb)
|
|
|
{
|
|
|
unsigned int dscp;
|
|
|
+ unsigned char vlan_priority;
|
|
|
|
|
|
/* skb->priority values from 256->263 are magic values to
|
|
|
* directly indicate a specific 802.1d priority. This is used
|
|
@@ -700,6 +702,13 @@ unsigned int cfg80211_classify8021d(struct sk_buff *skb)
|
|
|
if (skb->priority >= 256 && skb->priority <= 263)
|
|
|
return skb->priority - 256;
|
|
|
|
|
|
+ if (vlan_tx_tag_present(skb)) {
|
|
|
+ vlan_priority = (vlan_tx_tag_get(skb) & VLAN_PRIO_MASK)
|
|
|
+ >> VLAN_PRIO_SHIFT;
|
|
|
+ if (vlan_priority > 0)
|
|
|
+ return vlan_priority;
|
|
|
+ }
|
|
|
+
|
|
|
switch (skb->protocol) {
|
|
|
case htons(ETH_P_IP):
|
|
|
dscp = ipv4_get_dsfield(ip_hdr(skb)) & 0xfc;
|