On Wed, Dec 20, 2023 at 1:43 AM Linus Walleij linus.walleij@linaro.org wrote:
Then for *this* driver I need to check for the ethertype ETH_P_8021Q what is inside it, one level down, and that is a separate helper. And I named it skb_vlan_raw_inner_ethertype() It will retrieve the inner type no matter
include/linux/if_vlan.h
+/* This determines the inner ethertype incoded into the skb data without
- relying on skb->protocol which is not always identical.
- */
+static inline u16 skb_vlan_raw_inner_ethertype(const struct sk_buff *skb) +{
struct vlan_ethhdr *vhdr;
if (!skb_pointer_if_linear(skb, 0, VLAN_ETH_HLEN))
return 0x0000U;
vhdr = vlan_eth_hdr(skb);
return ntohs(vhdr->h_vlan_encapsulated_proto);
+}
(We can bikeshed the name of the function. *_inner_protocol maybe.)
It does not handle nested VLANs and I don't see why it should since the immediate siblings in if_vlan.h does not, i.e. vlan_eth_hdr(), skb_vlan_eth_hdr(). It's pretty clear these helpers all go just one level down. (We can add a *_descend_*() helper the day someone needs that.)
Forget this whole discussion because in <linux/if_vlan.h> there is already vlan_get_protocol() and vlan_get_protocol_and_depth() so this problem is already solved, just better.
Yours, Linus Walleij