Merge tag 'pci-v4.9-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci
[cascardo/linux.git] / include / linux / if_vlan.h
index a5f6ce6..3319d97 100644 (file)
@@ -81,6 +81,7 @@ static inline bool is_vlan_dev(const struct net_device *dev)
 #define skb_vlan_tag_present(__skb)    ((__skb)->vlan_tci & VLAN_TAG_PRESENT)
 #define skb_vlan_tag_get(__skb)                ((__skb)->vlan_tci & ~VLAN_TAG_PRESENT)
 #define skb_vlan_tag_get_id(__skb)     ((__skb)->vlan_tci & VLAN_VID_MASK)
+#define skb_vlan_tag_get_prio(__skb)   ((__skb)->vlan_tci & VLAN_PRIO_MASK)
 
 /**
  *     struct vlan_pcpu_stats - VLAN percpu rx/tx stats
@@ -271,6 +272,23 @@ static inline int vlan_get_encap_level(struct net_device *dev)
 }
 #endif
 
+/**
+ * eth_type_vlan - check for valid vlan ether type.
+ * @ethertype: ether type to check
+ *
+ * Returns true if the ether type is a vlan ether type.
+ */
+static inline bool eth_type_vlan(__be16 ethertype)
+{
+       switch (ethertype) {
+       case htons(ETH_P_8021Q):
+       case htons(ETH_P_8021AD):
+               return true;
+       default:
+               return false;
+       }
+}
+
 static inline bool vlan_hw_offload_capable(netdev_features_t features,
                                           __be16 proto)
 {
@@ -424,8 +442,7 @@ static inline int __vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci)
 {
        struct vlan_ethhdr *veth = (struct vlan_ethhdr *)skb->data;
 
-       if (veth->h_vlan_proto != htons(ETH_P_8021Q) &&
-           veth->h_vlan_proto != htons(ETH_P_8021AD))
+       if (!eth_type_vlan(veth->h_vlan_proto))
                return -EINVAL;
 
        *vlan_tci = ntohs(veth->h_vlan_TCI);
@@ -487,7 +504,7 @@ static inline __be16 __vlan_get_protocol(struct sk_buff *skb, __be16 type,
         * present at mac_len - VLAN_HLEN (if mac_len > 0), or at
         * ETH_HLEN otherwise
         */
-       if (type == htons(ETH_P_8021Q) || type == htons(ETH_P_8021AD)) {
+       if (eth_type_vlan(type)) {
                if (vlan_depth) {
                        if (WARN_ON(vlan_depth < VLAN_HLEN))
                                return 0;
@@ -505,8 +522,7 @@ static inline __be16 __vlan_get_protocol(struct sk_buff *skb, __be16 type,
                        vh = (struct vlan_hdr *)(skb->data + vlan_depth);
                        type = vh->h_vlan_encapsulated_proto;
                        vlan_depth += VLAN_HLEN;
-               } while (type == htons(ETH_P_8021Q) ||
-                        type == htons(ETH_P_8021AD));
+               } while (eth_type_vlan(type));
        }
 
        if (depth)
@@ -571,8 +587,7 @@ static inline void vlan_set_encap_proto(struct sk_buff *skb,
 static inline bool skb_vlan_tagged(const struct sk_buff *skb)
 {
        if (!skb_vlan_tag_present(skb) &&
-           likely(skb->protocol != htons(ETH_P_8021Q) &&
-                  skb->protocol != htons(ETH_P_8021AD)))
+           likely(!eth_type_vlan(skb->protocol)))
                return false;
 
        return true;
@@ -592,15 +607,14 @@ static inline bool skb_vlan_tagged_multi(const struct sk_buff *skb)
        if (!skb_vlan_tag_present(skb)) {
                struct vlan_ethhdr *veh;
 
-               if (likely(protocol != htons(ETH_P_8021Q) &&
-                          protocol != htons(ETH_P_8021AD)))
+               if (likely(!eth_type_vlan(protocol)))
                        return false;
 
                veh = (struct vlan_ethhdr *)skb->data;
                protocol = veh->h_vlan_encapsulated_proto;
        }
 
-       if (protocol != htons(ETH_P_8021Q) && protocol != htons(ETH_P_8021AD))
+       if (!eth_type_vlan(protocol))
                return false;
 
        return true;