[libvirt] [PATCH] qemu: handle multicast overflow on macvtap for NIC_RX_FILTER_CHANGED

Jason Baron jbaron at akamai.com
Mon Nov 26 16:38:46 UTC 2018



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 at 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




More information about the libvir-list mailing list