diff options
-rw-r--r-- | net/wireless/util.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/net/wireless/util.c b/net/wireless/util.c index 780b4546c9c7..ad03af385556 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <net/ip.h> | 11 | #include <net/ip.h> |
12 | #include <net/dsfield.h> | 12 | #include <net/dsfield.h> |
13 | #include <linux/if_vlan.h> | 13 | #include <linux/if_vlan.h> |
14 | #include <linux/mpls.h> | ||
14 | #include "core.h" | 15 | #include "core.h" |
15 | #include "rdev-ops.h" | 16 | #include "rdev-ops.h" |
16 | 17 | ||
@@ -717,6 +718,21 @@ unsigned int cfg80211_classify8021d(struct sk_buff *skb, | |||
717 | case htons(ETH_P_IPV6): | 718 | case htons(ETH_P_IPV6): |
718 | dscp = ipv6_get_dsfield(ipv6_hdr(skb)) & 0xfc; | 719 | dscp = ipv6_get_dsfield(ipv6_hdr(skb)) & 0xfc; |
719 | break; | 720 | break; |
721 | case htons(ETH_P_MPLS_UC): | ||
722 | case htons(ETH_P_MPLS_MC): { | ||
723 | struct mpls_label mpls_tmp, *mpls; | ||
724 | |||
725 | mpls = skb_header_pointer(skb, sizeof(struct ethhdr), | ||
726 | sizeof(*mpls), &mpls_tmp); | ||
727 | if (!mpls) | ||
728 | return 0; | ||
729 | |||
730 | return (ntohl(mpls->entry) & MPLS_LS_TC_MASK) | ||
731 | >> MPLS_LS_TC_SHIFT; | ||
732 | } | ||
733 | case htons(ETH_P_80221): | ||
734 | /* 802.21 is always network control traffic */ | ||
735 | return 7; | ||
720 | default: | 736 | default: |
721 | return 0; | 737 | return 0; |
722 | } | 738 | } |