[libvirt] [PATCH 3/3] virDomainNetFindIdx: Ignore auto generated MAC addresses

John Ferlan jferlan at redhat.com
Wed Oct 4 13:28:20 UTC 2017



On 10/02/2017 07:01 AM, Michal Privoznik wrote:
> When detaching an <interface/> from domain, it's MAC address is

s/from domain/from a domain/
s/it's/the

> parsed and if not present one is generated. If, however, no

s/, however,//

> corresponding interface is found in the domain, the following
> error is reported:
> 
> error: operation failed: no device matching mac address 52:54:00:75:32:5b found
> 
> where the MAC address is the auto generated one. This might be
> very confusing. Solution to this is to ignore auto generated MAC
> address when looking up the device.
> 
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/conf/domain_conf.c | 45 +++++++++++++++++++++++++++++++++++----------
>  1 file changed, 35 insertions(+), 10 deletions(-)
> 

I had looked at this series too, but forgot to send this when something
else caused me to reboot.... Patch 1 and 2 I had no comments...

My primary comment here is should the new message generated in some way
indicate that it's the generated mac... It's no big deal, but just a
thought and may help compared to having to look for the generic message.


> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 87192eb2d..aab43d307 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -15634,11 +15634,17 @@ int virDomainNetInsert(virDomainDefPtr def, virDomainNetDefPtr net)
>      return 0;
>  }
>  
> -/* virDomainNetFindIdx: search according to mac address and guest side
> - *                      PCI address (if specified)
> +/**
> + * virDomainNetFindIdx:
> + * @def: domain definition
> + * @net: interface definition
>   *
> - * Return: index of match if unique match found
> - *         -1 otherwise and an error is logged
> + * Lookup domain's network interface based on passed @net
> + * definition. If @net's MAC address was auto generated,
> + * the MAC comparison is ignored.
> + *
> + * Return: index of match if unique match found,
> + *         -1 otherwise and an error is logged.
>   */
>  int
>  virDomainNetFindIdx(virDomainDefPtr def, virDomainNetDefPtr net)
> @@ -15646,11 +15652,13 @@ virDomainNetFindIdx(virDomainDefPtr def, virDomainNetDefPtr net)
>      size_t i;
>      int matchidx = -1;
>      char mac[VIR_MAC_STRING_BUFLEN];
> +    bool MACAddrSpecified = !net->mac.generated;
>      bool PCIAddrSpecified = virDomainDeviceAddressIsValid(&net->info,
>                                                            VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI);
>  
>      for (i = 0; i < def->nnets; i++) {
> -        if (virMacAddrCmp(&def->nets[i]->mac, &net->mac))
> +        if (MACAddrSpecified &&
> +            virMacAddrCmp(&def->nets[i]->mac, &net->mac) != 0)
>              continue;
>  
>          if ((matchidx >= 0) && !PCIAddrSpecified) {
> @@ -15660,9 +15668,15 @@ virDomainNetFindIdx(virDomainDefPtr def, virDomainNetDefPtr net)
>               * specify only vendor and product ID, and there may be
>               * multiples of those.
>               */
> -            virReportError(VIR_ERR_OPERATION_FAILED,
> -                           _("multiple devices matching mac address %s found"),
> -                           virMacAddrFormat(&net->mac, mac));
> +            if (MACAddrSpecified) {
> +                virReportError(VIR_ERR_OPERATION_FAILED,
> +                               _("multiple devices matching mac address %s found"),
> +                               virMacAddrFormat(&net->mac, mac));
> +            } else {
> +                virReportError(VIR_ERR_OPERATION_FAILED, "%s",
> +                               _("multiple matching devices found"));

multiple devices matching generated mac address found ?

> +            }
> +
>              return -1;
>          }
>          if (PCIAddrSpecified) {
> @@ -15679,8 +15693,9 @@ virDomainNetFindIdx(virDomainDefPtr def, virDomainNetDefPtr net)
>              matchidx = i;
>          }
>      }
> +
>      if (matchidx < 0) {
> -        if (PCIAddrSpecified) {
> +        if (MACAddrSpecified && PCIAddrSpecified) {
>              virReportError(VIR_ERR_OPERATION_FAILED,
>                             _("no device matching mac address %s found on "
>                               "%.4x:%.2x:%.2x.%.1x"),
> @@ -15689,10 +15704,20 @@ virDomainNetFindIdx(virDomainDefPtr def, virDomainNetDefPtr net)
>                             net->info.addr.pci.bus,
>                             net->info.addr.pci.slot,
>                             net->info.addr.pci.function);
> -        } else {
> +        } else if (PCIAddrSpecified) {
> +            virReportError(VIR_ERR_OPERATION_FAILED,
> +                           _("no device found on %.4x:%.2x:%.2x.%.1x"), 

no device using generated mac address found on ... ?

> +                           net->info.addr.pci.domain,
> +                           net->info.addr.pci.bus,
> +                           net->info.addr.pci.slot,
> +                           net->info.addr.pci.function);
> +        } else if (MACAddrSpecified) {
>              virReportError(VIR_ERR_OPERATION_FAILED,
>                             _("no device matching mac address %s found"),
>                             virMacAddrFormat(&net->mac, mac));
> +        } else {
> +            virReportError(VIR_ERR_OPERATION_FAILED, "%s",
> +                           _("no matching device found"));

no device using generated mac address found ?

>          }
>      }
>      return matchidx;
> 




More information about the libvir-list mailing list