On 11/26/18 11:24 AM, Michal Privoznik wrote:
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(a)akamai.com>
>> ---
>> 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) { ... }.
Ok, I didn't change this call (just moved down). Also, there are other
calls in syncNicRxFilterMultiMode() to virNetDevSetRcvMulti() and
virNetDevSetRcvAllMulti() that just check for non-zero. Should those be
changed as well? If so, I think that should done in a separate patch?
>> 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);
}
Ok, will fix.
Thanks,
-Jason