mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-01 17:35:17 +00:00
conf: parser/formatter/rng for <forward mode='hostdev'>
This patch introduces the new forward mode='hostdev' along with attribute managed. Includes updates to the network RNG and new xml parser/formatter code. Signed-off-by: Shradha Shah <sshah@solarflare.com>
This commit is contained in:
parent
1494897bac
commit
1446003419
@ -54,6 +54,31 @@
|
|||||||
</choice>
|
</choice>
|
||||||
</define>
|
</define>
|
||||||
|
|
||||||
|
<define name="pciaddress">
|
||||||
|
<optional>
|
||||||
|
<attribute name="domain">
|
||||||
|
<ref name="pciDomain"/>
|
||||||
|
</attribute>
|
||||||
|
</optional>
|
||||||
|
<attribute name="bus">
|
||||||
|
<ref name="pciBus"/>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="slot">
|
||||||
|
<ref name="pciSlot"/>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="function">
|
||||||
|
<ref name="pciFunc"/>
|
||||||
|
</attribute>
|
||||||
|
<optional>
|
||||||
|
<attribute name="multifunction">
|
||||||
|
<choice>
|
||||||
|
<value>on</value>
|
||||||
|
<value>off</value>
|
||||||
|
</choice>
|
||||||
|
</attribute>
|
||||||
|
</optional>
|
||||||
|
</define>
|
||||||
|
|
||||||
<!-- a 6 byte MAC address in ASCII-hex format, eg "12:34:56:78:9A:BC" -->
|
<!-- a 6 byte MAC address in ASCII-hex format, eg "12:34:56:78:9A:BC" -->
|
||||||
<!-- The lowest bit of the 1st byte is the "multicast" bit. a -->
|
<!-- The lowest bit of the 1st byte is the "multicast" bit. a -->
|
||||||
<!-- uniMacAddr requires that bit to be 0, and a multiMacAddr -->
|
<!-- uniMacAddr requires that bit to be 0, and a multiMacAddr -->
|
||||||
@ -167,4 +192,25 @@
|
|||||||
<ref name='unsignedLong'/>
|
<ref name='unsignedLong'/>
|
||||||
</define>
|
</define>
|
||||||
|
|
||||||
|
<define name="pciDomain">
|
||||||
|
<data type="string">
|
||||||
|
<param name="pattern">(0x)?[0-9a-fA-F]{1,4}</param>
|
||||||
|
</data>
|
||||||
|
</define>
|
||||||
|
<define name="pciBus">
|
||||||
|
<data type="string">
|
||||||
|
<param name="pattern">(0x)?[0-9a-fA-F]{1,2}</param>
|
||||||
|
</data>
|
||||||
|
</define>
|
||||||
|
<define name="pciSlot">
|
||||||
|
<data type="string">
|
||||||
|
<param name="pattern">(0x)?[0-1]?[0-9a-fA-F]</param>
|
||||||
|
</data>
|
||||||
|
</define>
|
||||||
|
<define name="pciFunc">
|
||||||
|
<data type="string">
|
||||||
|
<param name="pattern">(0x)?[0-7]</param>
|
||||||
|
</data>
|
||||||
|
</define>
|
||||||
|
|
||||||
</grammar>
|
</grammar>
|
||||||
|
@ -2652,30 +2652,6 @@
|
|||||||
</attribute>
|
</attribute>
|
||||||
</optional>
|
</optional>
|
||||||
</define>
|
</define>
|
||||||
<define name="pciaddress">
|
|
||||||
<optional>
|
|
||||||
<attribute name="domain">
|
|
||||||
<ref name="pciDomain"/>
|
|
||||||
</attribute>
|
|
||||||
</optional>
|
|
||||||
<attribute name="bus">
|
|
||||||
<ref name="pciBus"/>
|
|
||||||
</attribute>
|
|
||||||
<attribute name="slot">
|
|
||||||
<ref name="pciSlot"/>
|
|
||||||
</attribute>
|
|
||||||
<attribute name="function">
|
|
||||||
<ref name="pciFunc"/>
|
|
||||||
</attribute>
|
|
||||||
<optional>
|
|
||||||
<attribute name="multifunction">
|
|
||||||
<choice>
|
|
||||||
<value>on</value>
|
|
||||||
<value>off</value>
|
|
||||||
</choice>
|
|
||||||
</attribute>
|
|
||||||
</optional>
|
|
||||||
</define>
|
|
||||||
<define name="driveaddress">
|
<define name="driveaddress">
|
||||||
<optional>
|
<optional>
|
||||||
<attribute name="controller">
|
<attribute name="controller">
|
||||||
@ -3376,26 +3352,6 @@
|
|||||||
<param name="pattern">((0x)?[0-9a-fA-F]{1,3}\.){0,3}(0x)?[0-9a-fA-F]{1,3}</param>
|
<param name="pattern">((0x)?[0-9a-fA-F]{1,3}\.){0,3}(0x)?[0-9a-fA-F]{1,3}</param>
|
||||||
</data>
|
</data>
|
||||||
</define>
|
</define>
|
||||||
<define name="pciDomain">
|
|
||||||
<data type="string">
|
|
||||||
<param name="pattern">(0x)?[0-9a-fA-F]{1,4}</param>
|
|
||||||
</data>
|
|
||||||
</define>
|
|
||||||
<define name="pciBus">
|
|
||||||
<data type="string">
|
|
||||||
<param name="pattern">(0x)?[0-9a-fA-F]{1,2}</param>
|
|
||||||
</data>
|
|
||||||
</define>
|
|
||||||
<define name="pciSlot">
|
|
||||||
<data type="string">
|
|
||||||
<param name="pattern">(0x)?[0-1]?[0-9a-fA-F]</param>
|
|
||||||
</data>
|
|
||||||
</define>
|
|
||||||
<define name="pciFunc">
|
|
||||||
<data type="string">
|
|
||||||
<param name="pattern">(0x)?[0-7]</param>
|
|
||||||
</data>
|
|
||||||
</define>
|
|
||||||
<define name="driveController">
|
<define name="driveController">
|
||||||
<data type="string">
|
<data type="string">
|
||||||
<param name="pattern">[0-9]{1,2}</param>
|
<param name="pattern">[0-9]{1,2}</param>
|
||||||
|
@ -87,10 +87,22 @@
|
|||||||
<value>passthrough</value>
|
<value>passthrough</value>
|
||||||
<value>private</value>
|
<value>private</value>
|
||||||
<value>vepa</value>
|
<value>vepa</value>
|
||||||
|
<value>hostdev</value>
|
||||||
|
</choice>
|
||||||
|
</attribute>
|
||||||
|
</optional>
|
||||||
|
|
||||||
|
<optional>
|
||||||
|
<attribute name="managed">
|
||||||
|
<choice>
|
||||||
|
<value>yes</value>
|
||||||
|
<value>no</value>
|
||||||
</choice>
|
</choice>
|
||||||
</attribute>
|
</attribute>
|
||||||
</optional>
|
</optional>
|
||||||
<interleave>
|
<interleave>
|
||||||
|
<choice>
|
||||||
|
<group>
|
||||||
<zeroOrMore>
|
<zeroOrMore>
|
||||||
<element name='interface'>
|
<element name='interface'>
|
||||||
<attribute name='dev'>
|
<attribute name='dev'>
|
||||||
@ -103,6 +115,23 @@
|
|||||||
</optional>
|
</optional>
|
||||||
</element>
|
</element>
|
||||||
</zeroOrMore>
|
</zeroOrMore>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<zeroOrMore>
|
||||||
|
<element name='address'>
|
||||||
|
<attribute name='type'>
|
||||||
|
<value>pci</value>
|
||||||
|
</attribute>
|
||||||
|
<ref name="pciaddress"/>
|
||||||
|
<optional>
|
||||||
|
<attribute name="connections">
|
||||||
|
<data type="unsignedInt"/>
|
||||||
|
</attribute>
|
||||||
|
</optional>
|
||||||
|
</element>
|
||||||
|
</zeroOrMore>
|
||||||
|
</group>
|
||||||
|
</choice>
|
||||||
<optional>
|
<optional>
|
||||||
<element name='pf'>
|
<element name='pf'>
|
||||||
<attribute name='dev'>
|
<attribute name='dev'>
|
||||||
|
@ -50,7 +50,12 @@
|
|||||||
|
|
||||||
VIR_ENUM_IMPL(virNetworkForward,
|
VIR_ENUM_IMPL(virNetworkForward,
|
||||||
VIR_NETWORK_FORWARD_LAST,
|
VIR_NETWORK_FORWARD_LAST,
|
||||||
"none", "nat", "route", "bridge", "private", "vepa", "passthrough" )
|
"none", "nat", "route", "bridge", "private", "vepa", "passthrough", "hostdev")
|
||||||
|
|
||||||
|
VIR_ENUM_DECL(virNetworkForwardHostdevDevice)
|
||||||
|
VIR_ENUM_IMPL(virNetworkForwardHostdevDevice,
|
||||||
|
VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_LAST,
|
||||||
|
"none", "pci", "netdev")
|
||||||
|
|
||||||
virNetworkObjPtr virNetworkFindByUUID(const virNetworkObjListPtr nets,
|
virNetworkObjPtr virNetworkFindByUUID(const virNetworkObjListPtr nets,
|
||||||
const unsigned char *uuid)
|
const unsigned char *uuid)
|
||||||
@ -96,7 +101,8 @@ virPortGroupDefClear(virPortGroupDefPtr def)
|
|||||||
static void
|
static void
|
||||||
virNetworkForwardIfDefClear(virNetworkForwardIfDefPtr def)
|
virNetworkForwardIfDefClear(virNetworkForwardIfDefPtr def)
|
||||||
{
|
{
|
||||||
VIR_FREE(def->dev);
|
if (def->type == VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_NETDEV)
|
||||||
|
VIR_FREE(def->device.dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -943,11 +949,14 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
|
|||||||
xmlNodePtr *portGroupNodes = NULL;
|
xmlNodePtr *portGroupNodes = NULL;
|
||||||
xmlNodePtr *forwardIfNodes = NULL;
|
xmlNodePtr *forwardIfNodes = NULL;
|
||||||
xmlNodePtr *forwardPfNodes = NULL;
|
xmlNodePtr *forwardPfNodes = NULL;
|
||||||
|
xmlNodePtr *forwardAddrNodes = NULL;
|
||||||
xmlNodePtr dnsNode = NULL;
|
xmlNodePtr dnsNode = NULL;
|
||||||
xmlNodePtr virtPortNode = NULL;
|
xmlNodePtr virtPortNode = NULL;
|
||||||
xmlNodePtr forwardNode = NULL;
|
xmlNodePtr forwardNode = NULL;
|
||||||
int nIps, nPortGroups, nForwardIfs, nForwardPfs;
|
int nIps, nPortGroups, nForwardIfs, nForwardPfs, nForwardAddrs;
|
||||||
char *forwardDev = NULL;
|
char *forwardDev = NULL;
|
||||||
|
char *forwardManaged = NULL;
|
||||||
|
char *type = NULL;
|
||||||
xmlNodePtr save = ctxt->node;
|
xmlNodePtr save = ctxt->node;
|
||||||
xmlNodePtr bandwidthNode = NULL;
|
xmlNodePtr bandwidthNode = NULL;
|
||||||
xmlNodePtr vlanNode;
|
xmlNodePtr vlanNode;
|
||||||
@ -1100,17 +1109,35 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
forwardDev = virXPathString("string(./@dev)", ctxt);
|
forwardDev = virXPathString("string(./@dev)", ctxt);
|
||||||
|
forwardManaged = virXPathString("string(./@managed)", ctxt);
|
||||||
|
if(forwardManaged != NULL) {
|
||||||
|
if (STRCASEEQ(forwardManaged, "yes"))
|
||||||
|
def->managed = 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* all of these modes can use a pool of physical interfaces */
|
/* all of these modes can use a pool of physical interfaces */
|
||||||
nForwardIfs = virXPathNodeSet("./interface", ctxt, &forwardIfNodes);
|
nForwardIfs = virXPathNodeSet("./interface", ctxt, &forwardIfNodes);
|
||||||
nForwardPfs = virXPathNodeSet("./pf", ctxt, &forwardPfNodes);
|
nForwardPfs = virXPathNodeSet("./pf", ctxt, &forwardPfNodes);
|
||||||
|
nForwardAddrs = virXPathNodeSet("./address", ctxt, &forwardAddrNodes);
|
||||||
|
|
||||||
if (nForwardIfs < 0 || nForwardPfs < 0) {
|
if (nForwardIfs < 0 || nForwardPfs < 0 || nForwardAddrs < 0) {
|
||||||
virReportError(VIR_ERR_XML_ERROR, "%s",
|
virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||||
_("No interface pool or SRIOV physical device given"));
|
_("No interface pool or SRIOV physical device given"));
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((nForwardIfs > 0) && (nForwardAddrs > 0)) {
|
||||||
|
virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||||
|
_("Address and interface attributes are mutually exclusive"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((nForwardPfs > 0) && ((nForwardIfs > 0) || (nForwardAddrs > 0))) {
|
||||||
|
virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||||
|
_("Address/interface attributes and Physical function are mutually exclusive "));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
if (nForwardPfs == 1) {
|
if (nForwardPfs == 1) {
|
||||||
if (VIR_ALLOC_N(def->forwardPfs, nForwardPfs) < 0) {
|
if (VIR_ALLOC_N(def->forwardPfs, nForwardPfs) < 0) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
@ -1139,7 +1166,53 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
|
|||||||
_("Use of more than one physical interface is not allowed"));
|
_("Use of more than one physical interface is not allowed"));
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if (nForwardIfs > 0 || forwardDev) {
|
if (nForwardAddrs > 0) {
|
||||||
|
int ii;
|
||||||
|
|
||||||
|
if (VIR_ALLOC_N(def->forwardIfs, nForwardAddrs) < 0) {
|
||||||
|
virReportOOMError();
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (forwardDev) {
|
||||||
|
virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||||
|
_("A forward Dev should not be used when using address attribute"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ii = 0; ii < nForwardAddrs; ii++) {
|
||||||
|
type = virXMLPropString(forwardAddrNodes[ii], "type");
|
||||||
|
|
||||||
|
if (type) {
|
||||||
|
if ((def->forwardIfs[ii].type = virNetworkForwardHostdevDeviceTypeFromString(type)) < 0) {
|
||||||
|
virReportError(VIR_ERR_XML_ERROR,
|
||||||
|
_("unknown address type '%s'"), type);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
virReportError(VIR_ERR_XML_ERROR,
|
||||||
|
"%s", _("No type specified for device address"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (def->forwardIfs[ii].type) {
|
||||||
|
case VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_PCI:
|
||||||
|
if (virDevicePCIAddressParseXML(forwardAddrNodes[ii], &(def->forwardIfs[ii].device.pci)) < 0)
|
||||||
|
goto error;
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Add USB case here */
|
||||||
|
|
||||||
|
default:
|
||||||
|
virReportError(VIR_ERR_XML_ERROR,
|
||||||
|
_("unknown address type '%s'"), type);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
VIR_FREE(type);
|
||||||
|
def->nForwardIfs++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (nForwardIfs > 0 || forwardDev) {
|
||||||
int ii;
|
int ii;
|
||||||
|
|
||||||
/* allocate array to hold all the portgroups */
|
/* allocate array to hold all the portgroups */
|
||||||
@ -1149,7 +1222,8 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (forwardDev) {
|
if (forwardDev) {
|
||||||
def->forwardIfs[0].dev = forwardDev;
|
def->forwardIfs[0].device.dev = forwardDev;
|
||||||
|
def->forwardIfs[0].type = VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_NETDEV;
|
||||||
forwardDev = NULL;
|
forwardDev = NULL;
|
||||||
def->nForwardIfs++;
|
def->nForwardIfs++;
|
||||||
}
|
}
|
||||||
@ -1167,10 +1241,10 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
|
|||||||
if ((ii == 0) && (def->nForwardIfs == 1)) {
|
if ((ii == 0) && (def->nForwardIfs == 1)) {
|
||||||
/* both forwardDev and an interface element are present.
|
/* both forwardDev and an interface element are present.
|
||||||
* If they don't match, it's an error. */
|
* If they don't match, it's an error. */
|
||||||
if (STRNEQ(forwardDev, def->forwardIfs[0].dev)) {
|
if (STRNEQ(forwardDev, def->forwardIfs[0].device.dev)) {
|
||||||
virReportError(VIR_ERR_XML_ERROR,
|
virReportError(VIR_ERR_XML_ERROR,
|
||||||
_("forward dev '%s' must match first interface element dev '%s' in network '%s'"),
|
_("forward dev '%s' must match first interface element dev '%s' in network '%s'"),
|
||||||
def->forwardIfs[0].dev,
|
def->forwardIfs[0].device.dev,
|
||||||
forwardDev, def->name);
|
forwardDev, def->name);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@ -1178,15 +1252,18 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
def->forwardIfs[ii].dev = forwardDev;
|
def->forwardIfs[ii].device.dev = forwardDev;
|
||||||
forwardDev = NULL;
|
forwardDev = NULL;
|
||||||
|
def->forwardIfs[ii].type = VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_NETDEV;
|
||||||
def->nForwardIfs++;
|
def->nForwardIfs++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
VIR_FREE(type);
|
||||||
VIR_FREE(forwardDev);
|
VIR_FREE(forwardDev);
|
||||||
|
VIR_FREE(forwardManaged);
|
||||||
VIR_FREE(forwardPfNodes);
|
VIR_FREE(forwardPfNodes);
|
||||||
VIR_FREE(forwardIfNodes);
|
VIR_FREE(forwardIfNodes);
|
||||||
|
VIR_FREE(forwardAddrNodes);
|
||||||
switch (def->forwardType) {
|
switch (def->forwardType) {
|
||||||
case VIR_NETWORK_FORWARD_ROUTE:
|
case VIR_NETWORK_FORWARD_ROUTE:
|
||||||
case VIR_NETWORK_FORWARD_NAT:
|
case VIR_NETWORK_FORWARD_NAT:
|
||||||
@ -1211,6 +1288,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
|
|||||||
case VIR_NETWORK_FORWARD_PRIVATE:
|
case VIR_NETWORK_FORWARD_PRIVATE:
|
||||||
case VIR_NETWORK_FORWARD_VEPA:
|
case VIR_NETWORK_FORWARD_VEPA:
|
||||||
case VIR_NETWORK_FORWARD_PASSTHROUGH:
|
case VIR_NETWORK_FORWARD_PASSTHROUGH:
|
||||||
|
case VIR_NETWORK_FORWARD_HOSTDEV:
|
||||||
if (def->bridge) {
|
if (def->bridge) {
|
||||||
virReportError(VIR_ERR_XML_ERROR,
|
virReportError(VIR_ERR_XML_ERROR,
|
||||||
_("bridge name not allowed in %s mode (network '%s')"),
|
_("bridge name not allowed in %s mode (network '%s')"),
|
||||||
@ -1311,6 +1389,7 @@ virNetworkDNSDefFormat(virBufferPtr buf,
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
virBufferAddLit(buf, "<dns>\n");
|
virBufferAddLit(buf, "<dns>\n");
|
||||||
|
virBufferAdjustIndent(buf, 2);
|
||||||
|
|
||||||
for (i = 0 ; i < def->ntxtrecords ; i++) {
|
for (i = 0 ; i < def->ntxtrecords ; i++) {
|
||||||
virBufferAsprintf(buf, "<txt name='%s' value='%s' />\n",
|
virBufferAsprintf(buf, "<txt name='%s' value='%s' />\n",
|
||||||
@ -1346,16 +1425,17 @@ virNetworkDNSDefFormat(virBufferPtr buf,
|
|||||||
char *ip = virSocketAddrFormat(&def->hosts[ii].ip);
|
char *ip = virSocketAddrFormat(&def->hosts[ii].ip);
|
||||||
|
|
||||||
virBufferAsprintf(buf, "<host ip='%s'>\n", ip);
|
virBufferAsprintf(buf, "<host ip='%s'>\n", ip);
|
||||||
|
virBufferAdjustIndent(buf, 2);
|
||||||
for (j = 0; j < def->hosts[ii].nnames; j++)
|
for (j = 0; j < def->hosts[ii].nnames; j++)
|
||||||
virBufferAsprintf(buf, "<hostname>%s</hostname>\n",
|
virBufferAsprintf(buf, "<hostname>%s</hostname>\n",
|
||||||
def->hosts[ii].names[j]);
|
def->hosts[ii].names[j]);
|
||||||
|
|
||||||
|
virBufferAdjustIndent(buf, -2);
|
||||||
virBufferAsprintf(buf, "</host>\n");
|
virBufferAsprintf(buf, "</host>\n");
|
||||||
VIR_FREE(ip);
|
VIR_FREE(ip);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
virBufferAdjustIndent(buf, -2);
|
||||||
virBufferAddLit(buf, "</dns>\n");
|
virBufferAddLit(buf, "</dns>\n");
|
||||||
out:
|
out:
|
||||||
return result;
|
return result;
|
||||||
@ -1390,6 +1470,7 @@ virNetworkIpDefFormat(virBufferPtr buf,
|
|||||||
virBufferAsprintf(buf," prefix='%u'", def->prefix);
|
virBufferAsprintf(buf," prefix='%u'", def->prefix);
|
||||||
}
|
}
|
||||||
virBufferAddLit(buf, ">\n");
|
virBufferAddLit(buf, ">\n");
|
||||||
|
virBufferAdjustIndent(buf, 2);
|
||||||
|
|
||||||
if (def->tftproot) {
|
if (def->tftproot) {
|
||||||
virBufferEscapeString(buf, "<tftp root='%s' />\n",
|
virBufferEscapeString(buf, "<tftp root='%s' />\n",
|
||||||
@ -1398,6 +1479,8 @@ virNetworkIpDefFormat(virBufferPtr buf,
|
|||||||
if ((def->nranges || def->nhosts)) {
|
if ((def->nranges || def->nhosts)) {
|
||||||
int ii;
|
int ii;
|
||||||
virBufferAddLit(buf, "<dhcp>\n");
|
virBufferAddLit(buf, "<dhcp>\n");
|
||||||
|
virBufferAdjustIndent(buf, 2);
|
||||||
|
|
||||||
for (ii = 0 ; ii < def->nranges ; ii++) {
|
for (ii = 0 ; ii < def->nranges ; ii++) {
|
||||||
char *saddr = virSocketAddrFormat(&def->ranges[ii].start);
|
char *saddr = virSocketAddrFormat(&def->ranges[ii].start);
|
||||||
if (!saddr)
|
if (!saddr)
|
||||||
@ -1438,11 +1521,14 @@ virNetworkIpDefFormat(virBufferPtr buf,
|
|||||||
VIR_FREE(ipaddr);
|
VIR_FREE(ipaddr);
|
||||||
}
|
}
|
||||||
virBufferAddLit(buf, "/>\n");
|
virBufferAddLit(buf, "/>\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virBufferAdjustIndent(buf, -2);
|
||||||
virBufferAddLit(buf, "</dhcp>\n");
|
virBufferAddLit(buf, "</dhcp>\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virBufferAdjustIndent(buf, -2);
|
||||||
virBufferAddLit(buf, "</ip>\n");
|
virBufferAddLit(buf, "</ip>\n");
|
||||||
|
|
||||||
result = 0;
|
result = 0;
|
||||||
@ -1459,13 +1545,13 @@ virPortGroupDefFormat(virBufferPtr buf,
|
|||||||
virBufferAddLit(buf, " default='yes'");
|
virBufferAddLit(buf, " default='yes'");
|
||||||
}
|
}
|
||||||
virBufferAddLit(buf, ">\n");
|
virBufferAddLit(buf, ">\n");
|
||||||
virBufferAdjustIndent(buf, 4);
|
virBufferAdjustIndent(buf, 2);
|
||||||
if (virNetDevVlanFormat(&def->vlan, buf) < 0)
|
if (virNetDevVlanFormat(&def->vlan, buf) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (virNetDevVPortProfileFormat(def->virtPortProfile, buf) < 0)
|
if (virNetDevVPortProfileFormat(def->virtPortProfile, buf) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
virNetDevBandwidthFormat(def->bandwidth, buf);
|
virNetDevBandwidthFormat(def->bandwidth, buf);
|
||||||
virBufferAdjustIndent(buf, -4);
|
virBufferAdjustIndent(buf, -2);
|
||||||
virBufferAddLit(buf, "</portgroup>\n");
|
virBufferAddLit(buf, "</portgroup>\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1482,6 +1568,7 @@ char *virNetworkDefFormat(const virNetworkDefPtr def, unsigned int flags)
|
|||||||
virBufferAsprintf(&buf, " connections='%d'", def->connections);
|
virBufferAsprintf(&buf, " connections='%d'", def->connections);
|
||||||
}
|
}
|
||||||
virBufferAddLit(&buf, ">\n");
|
virBufferAddLit(&buf, ">\n");
|
||||||
|
virBufferAdjustIndent(&buf, 2);
|
||||||
virBufferEscapeString(&buf, "<name>%s</name>\n", def->name);
|
virBufferEscapeString(&buf, "<name>%s</name>\n", def->name);
|
||||||
|
|
||||||
uuid = def->uuid;
|
uuid = def->uuid;
|
||||||
@ -1502,8 +1589,16 @@ char *virNetworkDefFormat(const virNetworkDefPtr def, unsigned int flags)
|
|||||||
}
|
}
|
||||||
virBufferAddLit(&buf, "<forward");
|
virBufferAddLit(&buf, "<forward");
|
||||||
virBufferEscapeString(&buf, " dev='%s'", dev);
|
virBufferEscapeString(&buf, " dev='%s'", dev);
|
||||||
virBufferAsprintf(&buf, " mode='%s'%s>\n", mode,
|
virBufferAsprintf(&buf, " mode='%s'", mode);
|
||||||
|
if (def->forwardType == VIR_NETWORK_FORWARD_HOSTDEV) {
|
||||||
|
if (def->managed == 1)
|
||||||
|
virBufferAddLit(&buf, " managed='yes'");
|
||||||
|
else
|
||||||
|
virBufferAddLit(&buf, " managed='no'");
|
||||||
|
}
|
||||||
|
virBufferAsprintf(&buf, "%s>\n",
|
||||||
(def->nForwardIfs || def->nForwardPfs) ? "" : "/");
|
(def->nForwardIfs || def->nForwardPfs) ? "" : "/");
|
||||||
|
virBufferAdjustIndent(&buf, 2);
|
||||||
|
|
||||||
/* For now, hard-coded to at most 1 forwardPfs */
|
/* For now, hard-coded to at most 1 forwardPfs */
|
||||||
if (def->nForwardPfs)
|
if (def->nForwardPfs)
|
||||||
@ -1513,8 +1608,9 @@ char *virNetworkDefFormat(const virNetworkDefPtr def, unsigned int flags)
|
|||||||
if (def->nForwardIfs &&
|
if (def->nForwardIfs &&
|
||||||
(!def->nForwardPfs || !(flags & VIR_NETWORK_XML_INACTIVE))) {
|
(!def->nForwardPfs || !(flags & VIR_NETWORK_XML_INACTIVE))) {
|
||||||
for (ii = 0; ii < def->nForwardIfs; ii++) {
|
for (ii = 0; ii < def->nForwardIfs; ii++) {
|
||||||
|
if (def->forwardType != VIR_NETWORK_FORWARD_HOSTDEV) {
|
||||||
virBufferEscapeString(&buf, "<interface dev='%s'",
|
virBufferEscapeString(&buf, "<interface dev='%s'",
|
||||||
def->forwardIfs[ii].dev);
|
def->forwardIfs[ii].device.dev);
|
||||||
if (!(flags & VIR_NETWORK_XML_INACTIVE) &&
|
if (!(flags & VIR_NETWORK_XML_INACTIVE) &&
|
||||||
(def->forwardIfs[ii].connections > 0)) {
|
(def->forwardIfs[ii].connections > 0)) {
|
||||||
virBufferAsprintf(&buf, " connections='%d'",
|
virBufferAsprintf(&buf, " connections='%d'",
|
||||||
@ -1522,7 +1618,17 @@ char *virNetworkDefFormat(const virNetworkDefPtr def, unsigned int flags)
|
|||||||
}
|
}
|
||||||
virBufferAddLit(&buf, "/>\n");
|
virBufferAddLit(&buf, "/>\n");
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
if (def->forwardIfs[ii].type == VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_PCI) {
|
||||||
|
if (virDevicePCIAddressFormat(&buf,
|
||||||
|
def->forwardIfs[ii].device.pci,
|
||||||
|
true) < 0)
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
virBufferAdjustIndent(&buf, -2);
|
||||||
if (def->nForwardPfs || def->nForwardIfs)
|
if (def->nForwardPfs || def->nForwardIfs)
|
||||||
virBufferAddLit(&buf, "</forward>\n");
|
virBufferAddLit(&buf, "</forward>\n");
|
||||||
}
|
}
|
||||||
@ -1555,27 +1661,24 @@ char *virNetworkDefFormat(const virNetworkDefPtr def, unsigned int flags)
|
|||||||
if (virNetworkDNSDefFormat(&buf, def->dns) < 0)
|
if (virNetworkDNSDefFormat(&buf, def->dns) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
virBufferAdjustIndent(&buf, 2);
|
|
||||||
if (virNetDevVlanFormat(&def->vlan, &buf) < 0)
|
if (virNetDevVlanFormat(&def->vlan, &buf) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
if (virNetDevBandwidthFormat(def->bandwidth, &buf) < 0)
|
if (virNetDevBandwidthFormat(def->bandwidth, &buf) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
virBufferAdjustIndent(&buf, -2);
|
|
||||||
|
|
||||||
for (ii = 0; ii < def->nips; ii++) {
|
for (ii = 0; ii < def->nips; ii++) {
|
||||||
if (virNetworkIpDefFormat(&buf, &def->ips[ii]) < 0)
|
if (virNetworkIpDefFormat(&buf, &def->ips[ii]) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
virBufferAdjustIndent(&buf, 2);
|
|
||||||
if (virNetDevVPortProfileFormat(def->virtPortProfile, &buf) < 0)
|
if (virNetDevVPortProfileFormat(def->virtPortProfile, &buf) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
virBufferAdjustIndent(&buf, -2);
|
|
||||||
|
|
||||||
for (ii = 0; ii < def->nPortGroups; ii++)
|
for (ii = 0; ii < def->nPortGroups; ii++)
|
||||||
if (virPortGroupDefFormat(&buf, &def->portGroups[ii]) < 0)
|
if (virPortGroupDefFormat(&buf, &def->portGroups[ii]) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
virBufferAdjustIndent(&buf, -2);
|
||||||
virBufferAddLit(&buf, "</network>\n");
|
virBufferAddLit(&buf, "</network>\n");
|
||||||
|
|
||||||
if (virBufferError(&buf))
|
if (virBufferError(&buf))
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
# include "virnetdevvportprofile.h"
|
# include "virnetdevvportprofile.h"
|
||||||
# include "virnetdevvlan.h"
|
# include "virnetdevvlan.h"
|
||||||
# include "virmacaddr.h"
|
# include "virmacaddr.h"
|
||||||
|
# include "device_conf.h"
|
||||||
|
|
||||||
enum virNetworkForwardType {
|
enum virNetworkForwardType {
|
||||||
VIR_NETWORK_FORWARD_NONE = 0,
|
VIR_NETWORK_FORWARD_NONE = 0,
|
||||||
@ -46,10 +47,20 @@ enum virNetworkForwardType {
|
|||||||
VIR_NETWORK_FORWARD_PRIVATE,
|
VIR_NETWORK_FORWARD_PRIVATE,
|
||||||
VIR_NETWORK_FORWARD_VEPA,
|
VIR_NETWORK_FORWARD_VEPA,
|
||||||
VIR_NETWORK_FORWARD_PASSTHROUGH,
|
VIR_NETWORK_FORWARD_PASSTHROUGH,
|
||||||
|
VIR_NETWORK_FORWARD_HOSTDEV,
|
||||||
|
|
||||||
VIR_NETWORK_FORWARD_LAST,
|
VIR_NETWORK_FORWARD_LAST,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum virNetworkForwardHostdevDeviceType {
|
||||||
|
VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_NONE = 0,
|
||||||
|
VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_PCI,
|
||||||
|
VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_NETDEV,
|
||||||
|
/* USB Device to be added here when supported */
|
||||||
|
|
||||||
|
VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_LAST,
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct _virNetworkDHCPRangeDef virNetworkDHCPRangeDef;
|
typedef struct _virNetworkDHCPRangeDef virNetworkDHCPRangeDef;
|
||||||
typedef virNetworkDHCPRangeDef *virNetworkDHCPRangeDefPtr;
|
typedef virNetworkDHCPRangeDef *virNetworkDHCPRangeDefPtr;
|
||||||
struct _virNetworkDHCPRangeDef {
|
struct _virNetworkDHCPRangeDef {
|
||||||
@ -132,7 +143,12 @@ struct _virNetworkIpDef {
|
|||||||
typedef struct _virNetworkForwardIfDef virNetworkForwardIfDef;
|
typedef struct _virNetworkForwardIfDef virNetworkForwardIfDef;
|
||||||
typedef virNetworkForwardIfDef *virNetworkForwardIfDefPtr;
|
typedef virNetworkForwardIfDef *virNetworkForwardIfDefPtr;
|
||||||
struct _virNetworkForwardIfDef {
|
struct _virNetworkForwardIfDef {
|
||||||
|
int type;
|
||||||
|
union {
|
||||||
|
virDevicePCIAddress pci; /*PCI Address of device */
|
||||||
|
/* when USB devices are supported a new variable to be added here */
|
||||||
char *dev; /* name of device */
|
char *dev; /* name of device */
|
||||||
|
}device;
|
||||||
int connections; /* how many guest interfaces are connected to this device? */
|
int connections; /* how many guest interfaces are connected to this device? */
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -140,6 +156,7 @@ typedef struct _virNetworkForwardPfDef virNetworkForwardPfDef;
|
|||||||
typedef virNetworkForwardPfDef *virNetworkForwardPfDefPtr;
|
typedef virNetworkForwardPfDef *virNetworkForwardPfDefPtr;
|
||||||
struct _virNetworkForwardPfDef {
|
struct _virNetworkForwardPfDef {
|
||||||
char *dev; /* name of device */
|
char *dev; /* name of device */
|
||||||
|
int connections; /* how many guest interfaces are connected to this device? */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _virPortGroupDef virPortGroupDef;
|
typedef struct _virPortGroupDef virPortGroupDef;
|
||||||
@ -168,6 +185,7 @@ struct _virNetworkDef {
|
|||||||
bool mac_specified;
|
bool mac_specified;
|
||||||
|
|
||||||
int forwardType; /* One of virNetworkForwardType constants */
|
int forwardType; /* One of virNetworkForwardType constants */
|
||||||
|
int managed; /* managed attribute for hostdev mode */
|
||||||
|
|
||||||
/* 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.
|
||||||
@ -243,8 +261,9 @@ char *virNetworkDefFormat(const virNetworkDefPtr def, unsigned int flags);
|
|||||||
static inline const char *
|
static inline const char *
|
||||||
virNetworkDefForwardIf(const virNetworkDefPtr def, size_t n)
|
virNetworkDefForwardIf(const virNetworkDefPtr def, size_t n)
|
||||||
{
|
{
|
||||||
return ((def->forwardIfs && (def->nForwardIfs > n))
|
return ((def->forwardIfs && (def->nForwardIfs > n) &&
|
||||||
? def->forwardIfs[n].dev : NULL);
|
def->forwardIfs[n].type == VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_NETDEV)
|
||||||
|
? def->forwardIfs[n].device.dev : NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
virPortGroupDefPtr virPortGroupFindByName(virNetworkDefPtr net,
|
virPortGroupDefPtr virPortGroupFindByName(virNetworkDefPtr net,
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
* esx_network_driver.c: network driver functions for managing VMware ESX
|
* esx_network_driver.c: network driver functions for managing VMware ESX
|
||||||
* host networks
|
* host networks
|
||||||
*
|
*
|
||||||
* Copyright (C) 2010-2011 Red Hat, Inc.
|
* Copyright (C) 2010-2012 Red Hat, Inc.
|
||||||
* Copyright (C) 2010-2012 Matthias Bolte <matthias.bolte@googlemail.com>
|
* Copyright (C) 2010-2012 Matthias Bolte <matthias.bolte@googlemail.com>
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
@ -422,9 +422,18 @@ esxNetworkDefineXML(virConnectPtr conn, const char *xml)
|
|||||||
for (i = 0; i < def->nForwardIfs; ++i) {
|
for (i = 0; i < def->nForwardIfs; ++i) {
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
|
||||||
|
if (def->forwardIfs[i].type !=
|
||||||
|
VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_NETDEV) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("unsupported device type in network %s "
|
||||||
|
"interface pool"),
|
||||||
|
def->name);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
for (physicalNic = physicalNicList; physicalNic != NULL;
|
for (physicalNic = physicalNicList; physicalNic != NULL;
|
||||||
physicalNic = physicalNic->_next) {
|
physicalNic = physicalNic->_next) {
|
||||||
if (STREQ(def->forwardIfs[i].dev, physicalNic->device)) {
|
if (STREQ(def->forwardIfs[i].device.dev, physicalNic->device)) {
|
||||||
if (esxVI_String_AppendValueToList
|
if (esxVI_String_AppendValueToList
|
||||||
(&hostVirtualSwitchBondBridge->nicDevice,
|
(&hostVirtualSwitchBondBridge->nicDevice,
|
||||||
physicalNic->key) < 0) {
|
physicalNic->key) < 0) {
|
||||||
@ -439,7 +448,7 @@ esxNetworkDefineXML(virConnectPtr conn, const char *xml)
|
|||||||
if (! found) {
|
if (! found) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Could not find PhysicalNic with name '%s'"),
|
_("Could not find PhysicalNic with name '%s'"),
|
||||||
def->forwardIfs[i].dev);
|
def->forwardIfs[i].device.dev);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -742,9 +751,12 @@ esxNetworkGetXMLDesc(virNetworkPtr network_, unsigned int flags)
|
|||||||
for (physicalNic = physicalNicList; physicalNic != NULL;
|
for (physicalNic = physicalNicList; physicalNic != NULL;
|
||||||
physicalNic = physicalNic->_next) {
|
physicalNic = physicalNic->_next) {
|
||||||
if (STREQ(physicalNicKey->value, physicalNic->key)) {
|
if (STREQ(physicalNicKey->value, physicalNic->key)) {
|
||||||
def->forwardIfs[def->nForwardIfs].dev = strdup(physicalNic->device);
|
def->forwardIfs[def->nForwardIfs].type
|
||||||
|
= VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_NETDEV;
|
||||||
|
def->forwardIfs[def->nForwardIfs].device.dev
|
||||||
|
= strdup(physicalNic->device);
|
||||||
|
|
||||||
if (def->forwardIfs[def->nForwardIfs].dev == NULL) {
|
if (def->forwardIfs[def->nForwardIfs].device.dev == NULL) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
@ -2805,8 +2805,8 @@ networkCreateInterfacePool(virNetworkDefPtr netdef) {
|
|||||||
netdef->nForwardIfs = num_virt_fns;
|
netdef->nForwardIfs = num_virt_fns;
|
||||||
|
|
||||||
for (ii = 0; ii < netdef->nForwardIfs; ii++) {
|
for (ii = 0; ii < netdef->nForwardIfs; ii++) {
|
||||||
netdef->forwardIfs[ii].dev = strdup(vfname[ii]);
|
netdef->forwardIfs[ii].device.dev = strdup(vfname[ii]);
|
||||||
if (!netdef->forwardIfs[ii].dev) {
|
if (!netdef->forwardIfs[ii].device.dev) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
@ -3057,7 +3057,7 @@ networkAllocateActualDevice(virDomainNetDefPtr iface)
|
|||||||
netdef->name);
|
netdef->name);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
iface->data.network.actual->data.direct.linkdev = strdup(dev->dev);
|
iface->data.network.actual->data.direct.linkdev = strdup(dev->device.dev);
|
||||||
if (!iface->data.network.actual->data.direct.linkdev) {
|
if (!iface->data.network.actual->data.direct.linkdev) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
goto error;
|
goto error;
|
||||||
@ -3115,7 +3115,7 @@ validate:
|
|||||||
/* we are now assured of success, so mark the allocation */
|
/* we are now assured of success, so mark the allocation */
|
||||||
dev->connections++;
|
dev->connections++;
|
||||||
VIR_DEBUG("Using physical device %s, %d connections",
|
VIR_DEBUG("Using physical device %s, %d connections",
|
||||||
dev->dev, dev->connections);
|
dev->device.dev, dev->connections);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (netdef) {
|
if (netdef) {
|
||||||
@ -3198,7 +3198,7 @@ networkNotifyActualDevice(virDomainNetDefPtr iface)
|
|||||||
/* find the matching interface and increment its connections */
|
/* find the matching interface and increment its connections */
|
||||||
|
|
||||||
for (ii = 0; ii < netdef->nForwardIfs; ii++) {
|
for (ii = 0; ii < netdef->nForwardIfs; ii++) {
|
||||||
if (STREQ(actualDev, netdef->forwardIfs[ii].dev)) {
|
if (STREQ(actualDev, netdef->forwardIfs[ii].device.dev)) {
|
||||||
dev = &netdef->forwardIfs[ii];
|
dev = &netdef->forwardIfs[ii];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -3229,7 +3229,7 @@ networkNotifyActualDevice(virDomainNetDefPtr iface)
|
|||||||
/* we are now assured of success, so mark the allocation */
|
/* we are now assured of success, so mark the allocation */
|
||||||
dev->connections++;
|
dev->connections++;
|
||||||
VIR_DEBUG("Using physical device %s, %d connections",
|
VIR_DEBUG("Using physical device %s, %d connections",
|
||||||
dev->dev, dev->connections);
|
dev->device.dev, dev->connections);
|
||||||
}
|
}
|
||||||
|
|
||||||
success:
|
success:
|
||||||
@ -3305,7 +3305,7 @@ networkReleaseActualDevice(virDomainNetDefPtr iface)
|
|||||||
virNetworkForwardIfDefPtr dev = NULL;
|
virNetworkForwardIfDefPtr dev = NULL;
|
||||||
|
|
||||||
for (ii = 0; ii < netdef->nForwardIfs; ii++) {
|
for (ii = 0; ii < netdef->nForwardIfs; ii++) {
|
||||||
if (STREQ(actualDev, netdef->forwardIfs[ii].dev)) {
|
if (STREQ(actualDev, netdef->forwardIfs[ii].device.dev)) {
|
||||||
dev = &netdef->forwardIfs[ii];
|
dev = &netdef->forwardIfs[ii];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -3320,7 +3320,7 @@ networkReleaseActualDevice(virDomainNetDefPtr iface)
|
|||||||
|
|
||||||
dev->connections--;
|
dev->connections--;
|
||||||
VIR_DEBUG("Releasing physical device %s, %d connections",
|
VIR_DEBUG("Releasing physical device %s, %d connections",
|
||||||
dev->dev, dev->connections);
|
dev->device.dev, dev->connections);
|
||||||
}
|
}
|
||||||
|
|
||||||
success:
|
success:
|
||||||
@ -3410,7 +3410,7 @@ networkGetNetworkAddress(const char *netname, char **netaddr)
|
|||||||
case VIR_NETWORK_FORWARD_VEPA:
|
case VIR_NETWORK_FORWARD_VEPA:
|
||||||
case VIR_NETWORK_FORWARD_PASSTHROUGH:
|
case VIR_NETWORK_FORWARD_PASSTHROUGH:
|
||||||
if ((netdef->nForwardIfs > 0) && netdef->forwardIfs)
|
if ((netdef->nForwardIfs > 0) && netdef->forwardIfs)
|
||||||
dev_name = netdef->forwardIfs[0].dev;
|
dev_name = netdef->forwardIfs[0].device.dev;
|
||||||
|
|
||||||
if (!dev_name) {
|
if (!dev_name) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
7
tests/networkxml2xmlin/hostdev-pf.xml
Normal file
7
tests/networkxml2xmlin/hostdev-pf.xml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<network>
|
||||||
|
<name>hostdev</name>
|
||||||
|
<uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
|
||||||
|
<forward mode='hostdev' managed='yes'>
|
||||||
|
<pf dev='eth2'/>
|
||||||
|
</forward>
|
||||||
|
</network>
|
10
tests/networkxml2xmlin/hostdev.xml
Normal file
10
tests/networkxml2xmlin/hostdev.xml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<network>
|
||||||
|
<name>hostdev</name>
|
||||||
|
<uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
|
||||||
|
<forward mode='hostdev' managed='yes'>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x1'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x2'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x3'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x4'/>
|
||||||
|
</forward>
|
||||||
|
</network>
|
@ -3,8 +3,6 @@
|
|||||||
<uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
|
<uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
|
||||||
<forward mode="passthrough">
|
<forward mode="passthrough">
|
||||||
<pf dev='eth0'/>
|
<pf dev='eth0'/>
|
||||||
<interface dev='eth10'/>
|
|
||||||
<interface dev='eth11'/>
|
|
||||||
</forward>
|
</forward>
|
||||||
<ip address="192.168.122.1" netmask="255.255.255.0"/>
|
<ip address="192.168.122.1" netmask="255.255.255.0"/>
|
||||||
</network>
|
</network>
|
||||||
|
7
tests/networkxml2xmlout/hostdev-pf.xml
Normal file
7
tests/networkxml2xmlout/hostdev-pf.xml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<network>
|
||||||
|
<name>hostdev</name>
|
||||||
|
<uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
|
||||||
|
<forward mode='hostdev' managed='yes'>
|
||||||
|
<pf dev='eth2'/>
|
||||||
|
</forward>
|
||||||
|
</network>
|
10
tests/networkxml2xmlout/hostdev.xml
Normal file
10
tests/networkxml2xmlout/hostdev.xml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<network>
|
||||||
|
<name>hostdev</name>
|
||||||
|
<uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
|
||||||
|
<forward mode='hostdev' managed='yes'>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x1'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x2'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x3'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x4'/>
|
||||||
|
</forward>
|
||||||
|
</network>
|
@ -106,6 +106,8 @@ mymain(void)
|
|||||||
DO_TEST("bandwidth-network");
|
DO_TEST("bandwidth-network");
|
||||||
DO_TEST("openvswitch-net");
|
DO_TEST("openvswitch-net");
|
||||||
DO_TEST_FULL("passthrough-pf", VIR_NETWORK_XML_INACTIVE);
|
DO_TEST_FULL("passthrough-pf", VIR_NETWORK_XML_INACTIVE);
|
||||||
|
DO_TEST("hostdev");
|
||||||
|
DO_TEST_FULL("hostdev-pf", VIR_NETWORK_XML_INACTIVE);
|
||||||
|
|
||||||
return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user