Bug in FreeBSD VirtIO network driver (only with pf enabled)

Brian Rak brak at gameservers.com
Thu Aug 28 21:28:15 UTC 2014


Actually, is this related to 
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=192013 ? That looks 
awfully similar to what I imagine the fix for this issue would look like.


On 8/28/2014 12:35 AM, Bryan Venteicher wrote:
>
>
>
> On Wed, Aug 27, 2014 at 2:02 PM, Brian Rak <brak at gameservers.com 
> <mailto: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 <http://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 <http://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.
>
>
>
> ​It would appear that somewhere in pf the CSUM_TCP flag is getting 
> clear for CSUM_TSO packets. I don't believe the stack otherwise sets 
> CSUM_TSO without CSUM_TCP. Now, it is probably safe to assume CSUM_TCP 
> when CSUM_TSO is set: the mbuf's m_pkthdr.csum_data better be valid in 
> such cases though.
>
>     http://www.spinics.net/lists/netdev/msg293976.html gives more
>     detail on this.  I don't fully understand this, so I'd probably
>     mangle the explanation if I tried to give more detail.  I can
>     reproduce this at will now, but fixing it is beyond my abilities. 
>     Is there a better place to report this?  I'm not entirely sure who
>     is responsible for maintaining the virtio driver.
>     _______________________________________________
>     freebsd-hackers at freebsd.org <mailto:freebsd-hackers at freebsd.org>
>     mailing list
>     http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
>     To unsubscribe, send any mail to
>     "freebsd-hackers-unsubscribe at freebsd.org
>     <mailto:freebsd-hackers-unsubscribe at freebsd.org>"
>
>



More information about the freebsd-hackers mailing list