virtio-net vs qemu 1.5.0
Bryan Venteicher
bryanv at daemoninthecloset.org
Tue May 28 04:17:00 UTC 2013
Hi,
----- Original Message -----
> Hello,
>
> I filed a bug:
> http://www.freebsd.org/cgi/query-pr.cgi?pr=178955
>
I committed a fix to this in the multiqueue driver [1] during BSDCan,
haven't merged it back into HEAD yet. I'll do that in a couple of days.
Unless you have multiple MAC unicast and/or multicast addresses configured
on an interface, the error is harmless (for QEMU, which AFAIK, is the only
implementation that supports this feature).
[1] http://svnweb.freebsd.org/base?view=revision&revision=250802
> Julian
>
> On 05/23/2013 02:00 PM, Julian Stecklina wrote:
> > Hello,
> >
> > I just compiled qemu 1.5.0 and noticed that virtio network (on CURRENT as
> > of today) seems to have problems updating the MAC filter table:
> >
> > vtnet0: error setting host MAC filter table
> >
> > As far as I understand, if_vtnet.c does the following in
> > vtnet_rx_filter_mac. It appends two full struct vtnet_mac_tables (one for
> > unicast and one for multicast) to the request. Each consists of the number
> > of actual entries in the table and space for 128 (mostly unused) entries
> > in total.
> >
> > The qemu code parses this differently. It first reads the number of
> > elements in the first table and then skips over so many MAC addresses and
> > then expects the header to the second table (which in our case points to
> > zero'd memory). Then it skips those 0 MAC entries as well and expects that
> > it has consumed the whole request and returns an error, because there is
> > still data left. The relevant code is in qemu/hw/net/virtio-net.c in
> > virtio_net_handle_rx_mode.
> >
> > Assuming the qemu code is correct (of which I am not sure) the correct
> > solution would be to enqueue only so many MACs in the original requests as
> > are actually used. The following (a bit dirty) patch fixes this for me:
> >
> >
> > diff --git a/sys/dev/virtio/network/if_vtnet.c
> > b/sys/dev/virtio/network/if_vtnet.c
> > index ffc349a..6f00dfb 100644
> > --- a/sys/dev/virtio/network/if_vtnet.c
> > +++ b/sys/dev/virtio/network/if_vtnet.c
> > @@ -2470,9 +2470,9 @@ vtnet_rx_filter_mac(struct vtnet_softc *sc)
> > sglist_init(&sg, 4, segs);
> > error |= sglist_append(&sg, &hdr, sizeof(struct
> > virtio_net_ctrl_hdr));
> > error |= sglist_append(&sg, &filter->vmf_unicast,
> > - sizeof(struct vtnet_mac_table));
> > + sizeof(uint32_t) +
> > ETHER_ADDR_LEN*filter->vmf_unicast.nentries);
> > error |= sglist_append(&sg, &filter->vmf_multicast,
> > - sizeof(struct vtnet_mac_table));
> > + sizeof(uint32_t) +
> > ETHER_ADDR_LEN*filter->vmf_multicast.nentries);
> > error |= sglist_append(&sg, &ack, sizeof(uint8_t));
> > KASSERT(error == 0 && sg.sg_nseg == 4,
> > ("error adding MAC filtering message to sglist"));
> >
> > Any virtio guru here to comment on this?
> >
> > Julian
> >
>
>
> _______________________________________________
> freebsd-virtualization at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-virtualization
> To unsubscribe, send any mail to
> "freebsd-virtualization-unsubscribe at freebsd.org"
>
More information about the freebsd-virtualization
mailing list