|
@@ -11,6 +11,7 @@
|
|
#include <net/ip.h>
|
|
#include <net/ip.h>
|
|
#include <net/dsfield.h>
|
|
#include <net/dsfield.h>
|
|
#include <linux/if_vlan.h>
|
|
#include <linux/if_vlan.h>
|
|
|
|
+#include <linux/mpls.h>
|
|
#include "core.h"
|
|
#include "core.h"
|
|
#include "rdev-ops.h"
|
|
#include "rdev-ops.h"
|
|
|
|
|
|
@@ -717,6 +718,21 @@ unsigned int cfg80211_classify8021d(struct sk_buff *skb,
|
|
case htons(ETH_P_IPV6):
|
|
case htons(ETH_P_IPV6):
|
|
dscp = ipv6_get_dsfield(ipv6_hdr(skb)) & 0xfc;
|
|
dscp = ipv6_get_dsfield(ipv6_hdr(skb)) & 0xfc;
|
|
break;
|
|
break;
|
|
|
|
+ case htons(ETH_P_MPLS_UC):
|
|
|
|
+ case htons(ETH_P_MPLS_MC): {
|
|
|
|
+ struct mpls_label mpls_tmp, *mpls;
|
|
|
|
+
|
|
|
|
+ mpls = skb_header_pointer(skb, sizeof(struct ethhdr),
|
|
|
|
+ sizeof(*mpls), &mpls_tmp);
|
|
|
|
+ if (!mpls)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ return (ntohl(mpls->entry) & MPLS_LS_TC_MASK)
|
|
|
|
+ >> MPLS_LS_TC_SHIFT;
|
|
|
|
+ }
|
|
|
|
+ case htons(ETH_P_80221):
|
|
|
|
+ /* 802.21 is always network control traffic */
|
|
|
|
+ return 7;
|
|
default:
|
|
default:
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|