• Willem de Bruijn's avatar
    net: in virtio_net_hdr only add VLAN_HLEN to csum_start if payload holds vlan · fd3a8862
    Willem de Bruijn authored
    Tun, tap, virtio, packet and uml vector all use struct virtio_net_hdr
    to communicate packet metadata to userspace.
    
    For skbuffs with vlan, the first two return the packet as it may have
    existed on the wire, inserting the VLAN tag in the user buffer.  Then
    virtio_net_hdr.csum_start needs to be adjusted by VLAN_HLEN bytes.
    
    Commit f09e2249 ("macvtap: restore vlan header on user read")
    added this feature to macvtap. Commit 3ce9b20f ("macvtap: Fix
    csum_start when VLAN tags are present") then fixed up csum_start.
    
    Virtio, packet and uml do not insert the vlan header in the user
    buffer.
    
    When introducing virtio_net_hdr_from_skb to deduplicate filling in
    the virtio_net_hdr, the variant from macvtap which adds VLAN_HLEN was
    applied uniformly, breaking csum offset for packets with vlan on
    virtio and packet.
    
    Make insertion of VLAN_HLEN optional. Convert the callers to pass it
    when needed.
    
    Fixes: e858fae2 ("virtio_net: use common code for virtio_net_hdr and skb GSO conversion")
    Fixes: 1276f24e ("packet: use common code for virtio_net_hdr and skb GSO conversion")
    Signed-off-by: default avatarWillem de Bruijn <willemb@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    fd3a8862
tun.c 82.4 KB