On Wed, Dec 20, 2023 at 1:43 AM Linus Walleij <linus.walleij@xxxxxxxxxx> 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