Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 27 Aug 2014 13:26:05 -0600
From:      John Nielsen <lists@jnielsen.net>
To:        Brian Rak <brak@gameservers.com>, Bryan Venteicher <bryanv@freebsd.org>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: Bug in FreeBSD VirtIO network driver (only with pf enabled)
Message-ID:  <13EFC786-FFFB-479A-A65F-F33B07A78B9F@jnielsen.net>
In-Reply-To: <53FE2B37.7050309@gameservers.com>
References:  <53FE2B37.7050309@gameservers.com>

next in thread | previous in thread | raw e-mail | index | archive | help
The virtio maintainer is bryanv (CC'ed).

I have KVM+CentOS hosts available at $WORK so let me know if anyone =
needs help reproducing this or testing fixes.

On Aug 27, 2014, at 1:02 PM, Brian Rak <brak@gameservers.com> wrote:

> I have a FreeBSD 10 x64 guest installed inside a KVM instance on =
Linux.  When pf is active, and the server is sending data it causes the =
Linux host to report warnings related to GSO.
>=20
> I've talked to some Linux developers, and they believe it to be a bug =
inside the FreeBSD VirtIO drivers.  Based on what I'm seeing, I'm =
inclined to agree with them.
>=20
> Reproduction is mildly annoying, you need:
> 1) A KVM guest setup with bridged networking, with FreeBSD running =
side using the VirtIO network interface.  (We tested with CentOS, but =
the exact distribution should not matter)
> 2) pf enabled (I'm using a single rule: "scrub in all")
> 3) Some method of sending a bit of traffic from the guest (I use =
netcat)
>=20
> So, when I do this:
>=20
> # service pf start
> # cat /root/test | nc vultr.com 80
>=20
> The Linux kernel on the host will report:
>=20
> kernel: WARNING: CPU: 7 PID: 7772 at net/core/dev.c:2246 =
skb_warn_bad_offload+0xc3/0xd0()
> kernel: igb: caps=3D(0x0000000640114bb3, 0x0000000000000000) len=3D1498 =
data_len=3D0 gso_size=3D1380 gso_type=3D5 ip_summed=3D0
>=20
> If I do:
>=20
> # service pf stop
> # cat /root/test | nc vultr.com 80
>=20
> No such warning is reported.  I can only reproduce this with pf =
enabled.  The contents of the /root/test don't matter, I'm using 4k of =
data from /dev/urandom.  The test file just needs to be bigger then the =
MTU of the host's network interface.
>=20
> I was able to track this down to the virtio_net_hdr being sent by the =
FreeBSD guest.  With pf enabled, this outbound traffic has the following =
header:
>=20
> flags =3D  0
> gso_type =3D VIRTIO_NET_HDR_GSO_TCPV4
> hdr_len =3D 66
> gso_size =3D  1440
> csum_start =3D 0
> csum_offset =3D 0
>=20
> But, this is not a valid configuration.  With VIRTIO_NET_HDR_GSO_TCPV4 =
enabled, you should also be setting VIRTIO_NET_HDR_F_NEEDS_CSUM and =
populating the csum_start and csum_offset fields.




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?13EFC786-FFFB-479A-A65F-F33B07A78B9F>