When the packet has its vlan tag in skb->vlan_tci, the length of the VLAN header is not counted in skb->len. It doesn't make sense to subtract it.
In addition, to honor the comment below the code, the VLAN header length should not be subtracted if there's a vlan tag in skb->vlan_tci. This leads to the code simply subtracting the Ethernet header length. Fixes: 018c1dda5ff1 ("openvswitch: 802.1AD Flow handling, actions, vlan parsing, netlink attributes") Signed-off-by: Jiri Benc <jb...@redhat.com> --- net/openvswitch/vport.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/net/openvswitch/vport.c b/net/openvswitch/vport.c index 8f198437c724..210bafc09bd8 100644 --- a/net/openvswitch/vport.c +++ b/net/openvswitch/vport.c @@ -483,17 +483,13 @@ EXPORT_SYMBOL_GPL(ovs_vport_deferred_free); static unsigned int packet_length(const struct sk_buff *skb) { - unsigned int length = skb->len - ETH_HLEN; - - if (skb_vlan_tagged(skb)) - length -= VLAN_HLEN; - /* Don't subtract for multiple VLAN tags. Most (all?) drivers allow * (ETH_LEN + VLAN_HLEN) in addition to the mtu value, but almost none * account for 802.1ad. e.g. is_skb_forwardable(). + * Note that the first VLAN tag is always in skb->vlan_tci, thus not + * accounted for in skb->len. */ - - return length; + return skb->len - ETH_HLEN; } void ovs_vport_send(struct vport *vport, struct sk_buff *skb) -- 1.8.3.1