mirror of https://gitee.com/openkylin/libvirt.git
network: better validation of devices in hostdev network pool
This adds a few validations to the devices listed for a hostdev network: * devices must be listed by PCI address, not by netdev name * listing a device by PCI address is valid only for hostdev networks, not for other types of network (e.g. macvtap passthrough). * each device in a hostdev pool must be an SR-IOV VF Resolves: https://bugzilla.redhat.com/1004676
This commit is contained in:
parent
76107bf1d9
commit
5c8d622f5d
|
@ -3224,14 +3224,55 @@ networkValidate(virNetworkDriverStatePtr driver,
|
|||
* the type of each.
|
||||
*/
|
||||
for (i = 0; i < def->forward.nifs; i++) {
|
||||
switch ((virNetworkForwardHostdevDeviceType)
|
||||
def->forward.ifs[i].type) {
|
||||
virNetworkForwardIfDefPtr iface = &def->forward.ifs[i];
|
||||
char *sysfs_path = NULL;
|
||||
|
||||
switch ((virNetworkForwardHostdevDeviceType) iface->type) {
|
||||
case VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_NETDEV:
|
||||
usesInterface = true;
|
||||
|
||||
if (def->forward.type == VIR_NETWORK_FORWARD_HOSTDEV) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("hostdev network '%s' lists '%s' "
|
||||
"in the device pool, but hostdev "
|
||||
"networks require all devices to "
|
||||
"be listed by PCI address, not "
|
||||
"network device name"),
|
||||
def->name, iface->device.dev);
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
case VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_PCI:
|
||||
|
||||
case VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_PCI: {
|
||||
usesAddress = true;
|
||||
|
||||
if (def->forward.type != VIR_NETWORK_FORWARD_HOSTDEV) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("network '%s' has forward mode '%s' "
|
||||
" but lists a device by PCI address "
|
||||
"in the device pool. This is only "
|
||||
"supported for networks with forward "
|
||||
"mode 'hostdev'"),
|
||||
def->name,
|
||||
virNetworkForwardTypeToString(def->forward.type));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (virPCIDeviceAddressGetSysfsFile(&iface->device.pci, &sysfs_path) < 0)
|
||||
return -1;
|
||||
|
||||
if (!virPCIIsVirtualFunction(sysfs_path)) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("device '%s' in network '%s' is not "
|
||||
"an SR-IOV Virtual Function"),
|
||||
sysfs_path, def->name);
|
||||
VIR_FREE(sysfs_path);
|
||||
return -1;
|
||||
}
|
||||
VIR_FREE(sysfs_path);
|
||||
break;
|
||||
}
|
||||
|
||||
case VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_NONE:
|
||||
case VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_LAST:
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue