]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virDomainNetFindIdx: add support for CCW addresses
authorCornelia Huck <cohuck@redhat.com>
Thu, 24 Sep 2020 11:12:39 +0000 (13:12 +0200)
committerJán Tomko <jtomko@redhat.com>
Thu, 24 Sep 2020 11:48:31 +0000 (13:48 +0200)
Allow to match with CCW addresses in addition to PCI addresses
(and MAC addresses).

Signed-off-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Signed-off-by: Ján Tomko <jtomko@redhat.com>
src/conf/device_conf.c
src/conf/device_conf.h
src/conf/domain_conf.c
src/libvirt_private.syms

index 9398191dfd84eb8249cecfd5026b19da7ab157e0..87bf32bbc685dcb7e84ebbf83a392d11e6b55bc6 100644 (file)
@@ -341,6 +341,18 @@ virDomainDeviceCCWAddressParseXML(xmlNodePtr node,
     return 0;
 }
 
+bool
+virDomainDeviceCCWAddressEqual(virDomainDeviceCCWAddressPtr addr1,
+                               virDomainDeviceCCWAddressPtr addr2)
+{
+    if (addr1->cssid == addr2->cssid &&
+        addr1->ssid == addr2->ssid &&
+        addr1->devno == addr2->devno) {
+        return true;
+    }
+    return false;
+}
+
 int
 virDomainDeviceDriveAddressParseXML(xmlNodePtr node,
                                     virDomainDeviceDriveAddressPtr addr)
index d7395f22017466bb4003b7d78009035029620d57..a51bdf10ee6e79a08317d066fb8f1764dda99a68 100644 (file)
@@ -207,6 +207,9 @@ void virPCIDeviceAddressFormat(virBufferPtr buf,
 bool virDomainDeviceCCWAddressIsValid(virDomainDeviceCCWAddressPtr addr);
 int virDomainDeviceCCWAddressParseXML(xmlNodePtr node,
                                       virDomainDeviceCCWAddressPtr addr);
+bool virDomainDeviceCCWAddressEqual(virDomainDeviceCCWAddressPtr addr1,
+                                    virDomainDeviceCCWAddressPtr addr2);
+#define VIR_CCW_DEVICE_ADDRESS_FMT "%x.%x.%04x"
 
 int virDomainDeviceDriveAddressParseXML(xmlNodePtr node,
                                         virDomainDeviceDriveAddressPtr addr);
index 8d30557bdcbe148a0206f3855edba4651e491ae4..a91dbd4aa95b23ed25edd0651ff48bd98f158128 100644 (file)
@@ -17816,6 +17816,8 @@ virDomainNetFindIdx(virDomainDefPtr def, virDomainNetDefPtr net)
     bool MACAddrSpecified = !net->mac_generated;
     bool PCIAddrSpecified = virDomainDeviceAddressIsValid(&net->info,
                                                           VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI);
+    bool CCWAddrSpecified = virDomainDeviceAddressIsValid(&net->info,
+                                                          VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW);
 
     for (i = 0; i < def->nnets; i++) {
         if (MACAddrSpecified &&
@@ -17827,9 +17829,14 @@ virDomainNetFindIdx(virDomainDefPtr def, virDomainNetDefPtr net)
                                       &net->info.addr.pci))
             continue;
 
+        if (CCWAddrSpecified &&
+            !virDomainDeviceCCWAddressEqual(&def->nets[i]->info.addr.ccw,
+                                            &net->info.addr.ccw))
+            continue;
+
         if (matchidx >= 0) {
             /* there were multiple matches on mac address, and no
-             * qualifying guest-side PCI address was given, so we must
+             * qualifying guest-side PCI/CCW address was given, so we must
              * fail (NB: a USB address isn't adequate, since it may
              * specify only vendor and product ID, and there may be
              * multiples of those.
@@ -17859,6 +17866,14 @@ virDomainNetFindIdx(virDomainDefPtr def, virDomainNetDefPtr net)
                            net->info.addr.pci.bus,
                            net->info.addr.pci.slot,
                            net->info.addr.pci.function);
+        } else if (MACAddrSpecified && CCWAddrSpecified) {
+            virReportError(VIR_ERR_DEVICE_MISSING,
+                           _("no device matching MAC address %s found on "
+                             VIR_CCW_DEVICE_ADDRESS_FMT),
+                           virMacAddrFormat(&net->mac, mac),
+                           net->info.addr.ccw.cssid,
+                           net->info.addr.ccw.ssid,
+                           net->info.addr.ccw.devno);
         } else if (PCIAddrSpecified) {
             virReportError(VIR_ERR_DEVICE_MISSING,
                            _("no device found on " VIR_PCI_DEVICE_ADDRESS_FMT),
@@ -17866,6 +17881,12 @@ virDomainNetFindIdx(virDomainDefPtr def, virDomainNetDefPtr net)
                            net->info.addr.pci.bus,
                            net->info.addr.pci.slot,
                            net->info.addr.pci.function);
+        } else if (CCWAddrSpecified) {
+            virReportError(VIR_ERR_DEVICE_MISSING,
+                           _("no device found on " VIR_CCW_DEVICE_ADDRESS_FMT),
+                           net->info.addr.ccw.cssid,
+                           net->info.addr.ccw.ssid,
+                           net->info.addr.ccw.devno);
         } else if (MACAddrSpecified) {
             virReportError(VIR_ERR_DEVICE_MISSING,
                            _("no device matching MAC address %s found"),
index 1db9970cca0883192596264d172ac812fa8a2c8f..6bcbfa667d0e01845de07c6acd9fdea7faeb5774 100644 (file)
@@ -128,6 +128,7 @@ virDeviceInfoPCIAddressIsWanted;
 virDomainDeviceAddressIsValid;
 virDomainDeviceAddressTypeToString;
 virDomainDeviceCcidAddressParseXML;
+virDomainDeviceCCWAddressEqual;
 virDomainDeviceCCWAddressIsValid;
 virDomainDeviceCCWAddressParseXML;
 virDomainDeviceDriveAddressParseXML;