From: Shmulik Ladkani <shmulik.ladk...@ravellosystems.com> Date: Tue, 20 Sep 2016 12:48:36 +0300
> In 93515d53b1 > "net: move vlan pop/push functions into common code" > skb_vlan_pop was moved from its private location in openvswitch to > skbuff common code. > > In case skb has non hw-accel vlan tag, the original 'pop_vlan()' assured > that skb->len is sufficient (if skb->len < VLAN_ETH_HLEN then pop was > considered a no-op). > > This validation was moved as is into the new common 'skb_vlan_pop'. > > Alas, in its original location (openvswitch), there was a guarantee that > 'data' points to the mac_header, therefore the 'skb->len < VLAN_ETH_HLEN' > condition made sense. > However there's no such guarantee in the generic 'skb_vlan_pop'. > > For short packets received in rx path going through 'skb_vlan_pop', > this causes 'skb_vlan_pop' to fail pop-ing a valid vlan hdr (in the non > hw-accel case) or to fail moving next tag into hw-accel tag. > > Remove the 'skb->len < VLAN_ETH_HLEN' condition entirely: > It is superfluous since inner '__skb_vlan_pop' already verifies there > are VLAN_ETH_HLEN writable bytes at the mac_header. > > Note this presents a slight change to skb_vlan_pop() users: > In case total length is smaller than VLAN_ETH_HLEN, skb_vlan_pop() now > returns an error, as opposed to previous "no-op" behavior. > Existing callers (e.g. tc act vlan, ovs) usually drop the packet if > 'skb_vlan_pop' fails. > > Fixes: 93515d53b1 ("net: move vlan pop/push functions into common code") > Signed-off-by: Shmulik Ladkani <shmulik.ladk...@gmail.com> Applied.