mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-01 17:35:17 +00:00
network: support <driver name='vfio'/> in network definitions
I remembered to document this bit, but somehow forgot to implement it. This adds <driver name='kvm|vfio'/> as a subelement to the <forward> element of a network (this puts it parallel to the match between mode='hostdev' attribute in a network and type='hostdev' in an <interface>). Since it's already documented, only the parser, formatter, backend driver recognition (it just translates/moves the flag into the <interface> at the appropriate time), and a test case were needed. (I used a separate enum for the values both because the original is defined in domain_conf.h, which is unavailable from network_conf.h, and because in the future it's possible that we may want to support other non-hostdev oriented driver names in the network parser; this makes sure that one can be expanded without the other).
This commit is contained in:
parent
2d80fbb14d
commit
d64e114f14
@ -60,6 +60,12 @@ VIR_ENUM_IMPL(virNetworkForwardHostdevDevice,
|
|||||||
VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_LAST,
|
VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_LAST,
|
||||||
"none", "pci", "netdev")
|
"none", "pci", "netdev")
|
||||||
|
|
||||||
|
VIR_ENUM_IMPL(virNetworkForwardDriverName,
|
||||||
|
VIR_NETWORK_FORWARD_DRIVER_NAME_LAST,
|
||||||
|
"default",
|
||||||
|
"kvm",
|
||||||
|
"vfio")
|
||||||
|
|
||||||
virNetworkObjPtr virNetworkFindByUUID(const virNetworkObjListPtr nets,
|
virNetworkObjPtr virNetworkFindByUUID(const virNetworkObjListPtr nets,
|
||||||
const unsigned char *uuid)
|
const unsigned char *uuid)
|
||||||
{
|
{
|
||||||
@ -1443,6 +1449,7 @@ virNetworkForwardDefParseXML(const char *networkName,
|
|||||||
int nForwardIfs, nForwardAddrs, nForwardPfs, nForwardNats;
|
int nForwardIfs, nForwardAddrs, nForwardPfs, nForwardNats;
|
||||||
char *forwardDev = NULL;
|
char *forwardDev = NULL;
|
||||||
char *forwardManaged = NULL;
|
char *forwardManaged = NULL;
|
||||||
|
char *forwardDriverName = NULL;
|
||||||
char *type = NULL;
|
char *type = NULL;
|
||||||
xmlNodePtr save = ctxt->node;
|
xmlNodePtr save = ctxt->node;
|
||||||
|
|
||||||
@ -1465,6 +1472,21 @@ virNetworkForwardDefParseXML(const char *networkName,
|
|||||||
def->managed = true;
|
def->managed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
forwardDriverName = virXPathString("string(./driver/@name)", ctxt);
|
||||||
|
if (forwardDriverName) {
|
||||||
|
int driverName
|
||||||
|
= virNetworkForwardDriverNameTypeFromString(forwardDriverName);
|
||||||
|
|
||||||
|
if (driverName <= 0) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("Unknown forward <driver name='%s'/> "
|
||||||
|
"in network %s"),
|
||||||
|
forwardDriverName, networkName);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
def->driverName = driverName;
|
||||||
|
}
|
||||||
|
|
||||||
/* bridge and hostdev modes can use a pool of physical interfaces */
|
/* bridge and hostdev modes can use a pool of physical interfaces */
|
||||||
nForwardIfs = virXPathNodeSet("./interface", ctxt, &forwardIfNodes);
|
nForwardIfs = virXPathNodeSet("./interface", ctxt, &forwardIfNodes);
|
||||||
if (nForwardIfs < 0) {
|
if (nForwardIfs < 0) {
|
||||||
@ -1646,6 +1668,7 @@ cleanup:
|
|||||||
VIR_FREE(type);
|
VIR_FREE(type);
|
||||||
VIR_FREE(forwardDev);
|
VIR_FREE(forwardDev);
|
||||||
VIR_FREE(forwardManaged);
|
VIR_FREE(forwardManaged);
|
||||||
|
VIR_FREE(forwardDriverName);
|
||||||
VIR_FREE(forwardPfNodes);
|
VIR_FREE(forwardPfNodes);
|
||||||
VIR_FREE(forwardIfNodes);
|
VIR_FREE(forwardIfNodes);
|
||||||
VIR_FREE(forwardAddrNodes);
|
VIR_FREE(forwardAddrNodes);
|
||||||
@ -2230,10 +2253,24 @@ virNetworkDefFormatInternal(virBufferPtr buf,
|
|||||||
|| VIR_SOCKET_ADDR_VALID(&def->forward.addr.start)
|
|| VIR_SOCKET_ADDR_VALID(&def->forward.addr.start)
|
||||||
|| VIR_SOCKET_ADDR_VALID(&def->forward.addr.end)
|
|| VIR_SOCKET_ADDR_VALID(&def->forward.addr.end)
|
||||||
|| def->forward.port.start
|
|| def->forward.port.start
|
||||||
|| def->forward.port.end);
|
|| def->forward.port.end
|
||||||
|
|| (def->forward.driverName
|
||||||
|
!= VIR_NETWORK_FORWARD_DRIVER_NAME_DEFAULT));
|
||||||
virBufferAsprintf(buf, "%s>\n", shortforward ? "/" : "");
|
virBufferAsprintf(buf, "%s>\n", shortforward ? "/" : "");
|
||||||
virBufferAdjustIndent(buf, 2);
|
virBufferAdjustIndent(buf, 2);
|
||||||
|
|
||||||
|
if (def->forward.driverName
|
||||||
|
!= VIR_NETWORK_FORWARD_DRIVER_NAME_DEFAULT) {
|
||||||
|
const char *driverName
|
||||||
|
= virNetworkForwardDriverNameTypeToString(def->forward.driverName);
|
||||||
|
if (!driverName) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("unexpected hostdev driver name type %d "),
|
||||||
|
def->forward.driverName);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
virBufferAsprintf(buf, "<driver name='%s'/>\n", driverName);
|
||||||
|
}
|
||||||
if (def->forward.type == VIR_NETWORK_FORWARD_NAT) {
|
if (def->forward.type == VIR_NETWORK_FORWARD_NAT) {
|
||||||
if (virNetworkForwardNatDefFormat(buf, &def->forward) < 0)
|
if (virNetworkForwardNatDefFormat(buf, &def->forward) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* network_conf.h: network XML handling
|
* network_conf.h: network XML handling
|
||||||
*
|
*
|
||||||
* Copyright (C) 2006-2008, 2012 Red Hat, Inc.
|
* Copyright (C) 2006-2013 Red Hat, Inc.
|
||||||
* Copyright (C) 2006-2008 Daniel P. Berrange
|
* Copyright (C) 2006-2008 Daniel P. Berrange
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
@ -62,6 +62,20 @@ enum virNetworkForwardHostdevDeviceType {
|
|||||||
VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_LAST,
|
VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_LAST,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* The backend driver used for devices from the pool. Currently used
|
||||||
|
* only for PCI devices (vfio vs. kvm), but could be used for other
|
||||||
|
* device types in the future.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
VIR_NETWORK_FORWARD_DRIVER_NAME_DEFAULT, /* kvm now, could change */
|
||||||
|
VIR_NETWORK_FORWARD_DRIVER_NAME_KVM, /* force legacy kvm style */
|
||||||
|
VIR_NETWORK_FORWARD_DRIVER_NAME_VFIO, /* force vfio */
|
||||||
|
|
||||||
|
VIR_NETWORK_FORWARD_DRIVER_NAME_LAST
|
||||||
|
} virNetworkForwardDriverNameType;
|
||||||
|
|
||||||
|
VIR_ENUM_DECL(virNetworkForwardDriverName)
|
||||||
|
|
||||||
typedef struct _virNetworkDHCPHostDef virNetworkDHCPHostDef;
|
typedef struct _virNetworkDHCPHostDef virNetworkDHCPHostDef;
|
||||||
typedef virNetworkDHCPHostDef *virNetworkDHCPHostDefPtr;
|
typedef virNetworkDHCPHostDef *virNetworkDHCPHostDefPtr;
|
||||||
struct _virNetworkDHCPHostDef {
|
struct _virNetworkDHCPHostDef {
|
||||||
@ -159,6 +173,7 @@ typedef virNetworkForwardDef *virNetworkForwardDefPtr;
|
|||||||
struct _virNetworkForwardDef {
|
struct _virNetworkForwardDef {
|
||||||
int type; /* One of virNetworkForwardType constants */
|
int type; /* One of virNetworkForwardType constants */
|
||||||
bool managed; /* managed attribute for hostdev mode */
|
bool managed; /* managed attribute for hostdev mode */
|
||||||
|
int driverName; /* enum virNetworkForwardDriverNameType */
|
||||||
|
|
||||||
/* If there are multiple forward devices (i.e. a pool of
|
/* If there are multiple forward devices (i.e. a pool of
|
||||||
* interfaces), they will be listed here.
|
* interfaces), they will be listed here.
|
||||||
|
@ -3859,6 +3859,8 @@ networkAllocateActualDevice(virDomainNetDefPtr iface)
|
|||||||
|
|
||||||
} else if (netdef->forward.type == VIR_NETWORK_FORWARD_HOSTDEV) {
|
} else if (netdef->forward.type == VIR_NETWORK_FORWARD_HOSTDEV) {
|
||||||
|
|
||||||
|
virDomainHostdevSubsysPciBackendType backend;
|
||||||
|
|
||||||
if (!iface->data.network.actual
|
if (!iface->data.network.actual
|
||||||
&& (VIR_ALLOC(iface->data.network.actual) < 0)) {
|
&& (VIR_ALLOC(iface->data.network.actual) < 0)) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
@ -3893,6 +3895,27 @@ networkAllocateActualDevice(virDomainNetDefPtr iface)
|
|||||||
iface->data.network.actual->data.hostdev.def.source.subsys.type = dev->type;
|
iface->data.network.actual->data.hostdev.def.source.subsys.type = dev->type;
|
||||||
iface->data.network.actual->data.hostdev.def.source.subsys.u.pci.addr = dev->device.pci;
|
iface->data.network.actual->data.hostdev.def.source.subsys.u.pci.addr = dev->device.pci;
|
||||||
|
|
||||||
|
switch (netdef->forward.driverName)
|
||||||
|
{
|
||||||
|
case VIR_NETWORK_FORWARD_DRIVER_NAME_DEFAULT:
|
||||||
|
backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_DEFAULT;
|
||||||
|
break;
|
||||||
|
case VIR_NETWORK_FORWARD_DRIVER_NAME_KVM:
|
||||||
|
backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_KVM;
|
||||||
|
break;
|
||||||
|
case VIR_NETWORK_FORWARD_DRIVER_NAME_VFIO:
|
||||||
|
backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_VFIO;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("unrecognized driver name value %d "
|
||||||
|
" in network '%s'"),
|
||||||
|
netdef->forward.driverName, netdef->name);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
iface->data.network.actual->data.hostdev.def.source.subsys.u.pci.backend
|
||||||
|
= backend;
|
||||||
|
|
||||||
/* merge virtualports from interface, network, and portgroup to
|
/* merge virtualports from interface, network, and portgroup to
|
||||||
* arrive at actual virtualport to use
|
* arrive at actual virtualport to use
|
||||||
*/
|
*/
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
<name>hostdev</name>
|
<name>hostdev</name>
|
||||||
<uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
|
<uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
|
||||||
<forward mode='hostdev' managed='yes'>
|
<forward mode='hostdev' managed='yes'>
|
||||||
|
<driver name='vfio'/>
|
||||||
<pf dev='eth2'/>
|
<pf dev='eth2'/>
|
||||||
</forward>
|
</forward>
|
||||||
</network>
|
</network>
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
<name>hostdev</name>
|
<name>hostdev</name>
|
||||||
<uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
|
<uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
|
||||||
<forward mode='hostdev' managed='yes'>
|
<forward mode='hostdev' managed='yes'>
|
||||||
|
<driver name='vfio'/>
|
||||||
<pf dev='eth2'/>
|
<pf dev='eth2'/>
|
||||||
</forward>
|
</forward>
|
||||||
</network>
|
</network>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user