Bug in FreeBSD VirtIO network driver (only with pf enabled)
John Nielsen
lists at jnielsen.net
Wed Aug 27 19:29:47 UTC 2014
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 at 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.
>
> 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.
>
> 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)
>
> So, when I do this:
>
> # service pf start
> # cat /root/test | nc vultr.com 80
>
> The Linux kernel on the host will report:
>
> kernel: WARNING: CPU: 7 PID: 7772 at net/core/dev.c:2246 skb_warn_bad_offload+0xc3/0xd0()
> kernel: igb: caps=(0x0000000640114bb3, 0x0000000000000000) len=1498 data_len=0 gso_size=1380 gso_type=5 ip_summed=0
>
> If I do:
>
> # service pf stop
> # cat /root/test | nc vultr.com 80
>
> 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.
>
> 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:
>
> flags = 0
> gso_type = VIRTIO_NET_HDR_GSO_TCPV4
> hdr_len = 66
> gso_size = 1440
> csum_start = 0
> csum_offset = 0
>
> 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.
More information about the freebsd-hackers
mailing list