aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless/util.c
diff options
context:
space:
mode:
authorSimon Wunderlich <sw@simonwunderlich.de>2014-03-03 11:23:12 -0500
committerDavid S. Miller <davem@davemloft.net>2014-03-04 13:51:06 -0500
commit960d97f9518ef6fb8ff87450d6b0c88ce5df9532 (patch)
treee91b718ac33eecdf83271c01c93d20974b70ce67 /net/wireless/util.c
parentf3baa393ffc9a7aefc0bf767729382085e81f606 (diff)
cfg80211: add MPLS and 802.21 classification
MPLS labels may contain traffic control information, which should be evaluated and used by the wireless subsystem if present. Also check for IEEE 802.21 which is always network control traffic. Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de> Signed-off-by: Mathias Kretschmer <mathias.kretschmer@fokus.fraunhofer.de> Acked-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/wireless/util.c')
-rw-r--r--net/wireless/util.c16
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 }