diff options
Diffstat (limited to 'net/wireless')
-rw-r--r-- | net/wireless/chan.c | 2 | ||||
-rw-r--r-- | net/wireless/util.c | 16 |
2 files changed, 16 insertions, 2 deletions
diff --git a/net/wireless/chan.c b/net/wireless/chan.c index 5946450c540..cd10c198507 100644 --- a/net/wireless/chan.c +++ b/net/wireless/chan.c @@ -712,6 +712,4 @@ cfg80211_get_chan_state(struct wireless_dev *wdev, case NUM_NL80211_IFTYPES: WARN_ON(1); } - - return; } diff --git a/net/wireless/util.c b/net/wireless/util.c index 57b3ce7a6b9..2bb685f3e8f 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c @@ -11,6 +11,7 @@ #include <net/ip.h> #include <net/dsfield.h> #include <linux/if_vlan.h> +#include <linux/mpls.h> #include "core.h" #include "rdev-ops.h" @@ -717,6 +718,21 @@ unsigned int cfg80211_classify8021d(struct sk_buff *skb, case htons(ETH_P_IPV6): dscp = ipv6_get_dsfield(ipv6_hdr(skb)) & 0xfc; 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: return 0; } |