On Fri, Nov 30, 2018 at 12:50:26PM -0500, Jason Baron wrote: > Guest network devices can set 'overflow' when there are a number of multicast > ips configured. For virtio_net, the limit is only 64. In this case, the list > of mac addresses is empty and the 'overflow' condition is set. Thus, the guest > will currently receive no multicast traffic in this state. > > When 'overflow' is set in the guest, let's turn this into ALLMULTI on the host. > > Signed-off-by: Jason Baron <jbaron@xxxxxxxxxx> Acked-by: Michael S. Tsirkin <mst@xxxxxxxxxx> > --- > v1->v2: > 1. check for < 0 in virNetDevSetRcvAllMulti() (Michal Privoznik) > 2. restrict overflow check to VIR_NETDEV_RX_FILTER_MODE_NORMAL mode as to > avoid unnecessarily calling rx filter updates for other modes > 3. update virNetDevSetRcvAllMulti() call to use guestFilter->multicast.overflow > directly (Michal Privoznik) > > src/qemu/qemu_driver.c | 22 +++++++++++++++------- > 1 file changed, 15 insertions(+), 7 deletions(-) > > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c > index 7fb9102..f4bbfea 100644 > --- a/src/qemu/qemu_driver.c > +++ b/src/qemu/qemu_driver.c > @@ -4443,11 +4443,12 @@ static void > syncNicRxFilterMultiMode(char *ifname, virNetDevRxFilterPtr guestFilter, > virNetDevRxFilterPtr hostFilter) > { > - if (hostFilter->multicast.mode != guestFilter->multicast.mode) { > + if (hostFilter->multicast.mode != guestFilter->multicast.mode || > + (guestFilter->multicast.overflow && > + guestFilter->multicast.mode == VIR_NETDEV_RX_FILTER_MODE_NORMAL)) { > switch (guestFilter->multicast.mode) { > case VIR_NETDEV_RX_FILTER_MODE_ALL: > if (virNetDevSetRcvAllMulti(ifname, true)) { > - > VIR_WARN("Couldn't set allmulticast flag to 'on' for " > "device %s while responding to " > "NIC_RX_FILTER_CHANGED", ifname); > @@ -4455,17 +4456,24 @@ syncNicRxFilterMultiMode(char *ifname, virNetDevRxFilterPtr guestFilter, > break; > > case VIR_NETDEV_RX_FILTER_MODE_NORMAL: > - if (virNetDevSetRcvMulti(ifname, true)) { > + if (guestFilter->multicast.overflow && > + (hostFilter->multicast.mode == VIR_NETDEV_RX_FILTER_MODE_ALL)) { > + break; > + } > > + if (virNetDevSetRcvMulti(ifname, true)) { > VIR_WARN("Couldn't set multicast flag to 'on' for " > "device %s while responding to " > "NIC_RX_FILTER_CHANGED", ifname); > } > > - if (virNetDevSetRcvAllMulti(ifname, false)) { > - VIR_WARN("Couldn't set allmulticast flag to 'off' for " > - "device %s while responding to " > - "NIC_RX_FILTER_CHANGED", ifname); > + if (virNetDevSetRcvAllMulti(ifname, > + guestFilter->multicast.overflow) < 0) { > + VIR_WARN("Couldn't set allmulticast flag to '%s' for " > + "device %s while responding to " > + "NIC_RX_FILTER_CHANGED", > + virTristateSwitchTypeToString(virTristateSwitchFromBool(guestFilter->multicast.overflow)), > + ifname); > } > break; > > -- > 2.7.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list