On 11/26/18 5:10 PM, Michal Privoznik wrote: > On 11/21/18 4:04 PM, 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> >> --- >> src/qemu/qemu_driver.c | 26 +++++++++++++++++++------- >> 1 file changed, 19 insertions(+), 7 deletions(-) >> >> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c >> index 7fb9102..ea36db8 100644 >> --- a/src/qemu/qemu_driver.c >> +++ b/src/qemu/qemu_driver.c >> @@ -4443,11 +4443,11 @@ 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) { >> 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 +4455,29 @@ 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)) { Ah, please do proper error check: if (func() < 0) { ... }. >> 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 (guestFilter->multicast.overflow == true) { >> + if (virNetDevSetRcvAllMulti(ifname, true)) { >> + VIR_WARN("Couldn't set allmulticast flag to 'on' for " >> + "device %s while responding to " >> + "NIC_RX_FILTER_CHANGED", ifname); >> + } >> + } else { >> + if (virNetDevSetRcvAllMulti(ifname, false)) { >> + VIR_WARN("Couldn't set allmulticast flag to 'off' for " >> + "device %s while responding to " >> + "NIC_RX_FILTER_CHANGED", ifname); I wonder if we can do something like: 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); } Otherwise looking good. Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list