|
@@ -339,6 +339,31 @@ static inline int vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * vlan_get_protocol - get protocol EtherType.
|
|
|
+ * @skb: skbuff to query
|
|
|
+ *
|
|
|
+ * Returns the EtherType of the packet, regardless of whether it is
|
|
|
+ * vlan encapsulated (normal or hardware accelerated) or not.
|
|
|
+ */
|
|
|
+static inline __be16 vlan_get_protocol(const struct sk_buff *skb)
|
|
|
+{
|
|
|
+ __be16 protocol = 0;
|
|
|
+
|
|
|
+ if (vlan_tx_tag_present(skb) ||
|
|
|
+ skb->protocol != cpu_to_be16(ETH_P_8021Q))
|
|
|
+ protocol = skb->protocol;
|
|
|
+ else {
|
|
|
+ __be16 proto, *protop;
|
|
|
+ protop = skb_header_pointer(skb, offsetof(struct vlan_ethhdr,
|
|
|
+ h_vlan_encapsulated_proto),
|
|
|
+ sizeof(proto), &proto);
|
|
|
+ if (likely(protop))
|
|
|
+ protocol = *protop;
|
|
|
+ }
|
|
|
+
|
|
|
+ return protocol;
|
|
|
+}
|
|
|
#endif /* __KERNEL__ */
|
|
|
|
|
|
/* VLAN IOCTLs are found in sockios.h */
|