Hi, On Wed, 28 Sep 2016 12:30:56 +0200, dan...@iogearbox.net wrote: > > @@ -4608,6 +4608,8 @@ int skb_vlan_push(struct sk_buff *skb, __be16 > > vlan_proto, u16 vlan_tci) > > > > skb->protocol = skb->vlan_proto; > > skb->mac_len += VLAN_HLEN; > > + if (offset) > > + offset += VLAN_HLEN; > > > > skb_postpush_rcsum(skb, skb->data + (2 * ETH_ALEN), VLAN_HLEN); > > __skb_pull(skb, offset); > > This looks much better indeed than your v1 of this patch.
Yep, after some meditation and history digging I happened to notice I was barking at the wrong tree. > So the issue might only be visible to act_vlan as the other remaining user of > skb_vlan_push(). Yes, this is correct. I'll amend the log message to express that. The bug occurs for callers of skb_vlan_push() whose data is not pointing at mac_header. > My only question would be: > what about __skb_vlan_pop(), wouldn't that then need the same adjustment > a la offset -= VLAN_HLEN? Well, theoretically, yes; but caller may expect 2 different things: (assuming tags are in-payload) (1) suppose upon entry we have DA,SA,0x8100,TCI,0x0800, ^ ^ mac_hdr data initial offset is 18, and after current unwinding code we'll get DA,SA,0x0800,4_bytes, ^ ^ mac_hdr data which is probably incorrect, adjustment 'offset -= VLAN_HLEN' is needed. (2) suppose upon entry we have DA,SA,0x8100,TCI,0x0800 ^ ^ mac_hdr data initial offset is 14, and after current unwinding code we'll get DA,SA,0x0800, ^ ^ mac_hdr data which is probably what user has intended. (had we adjusted offset to be 10, 'data' would point into SA) From test I've made using act_vlan upon ingress on QinQ tags, existing call provides data as in (2). Thoughts? Should we adjust "offset" back, only if resulting offset is >=14 ? Thanks, Shmulik