Allow network capabilities hostdev to configure IP addresses

This commit is contained in:
Cédric Bosdonnat 2014-07-23 17:14:00 +02:00
parent 12a75f371c
commit 2811cc611e
5 changed files with 70 additions and 4 deletions

View File

@ -4330,6 +4330,14 @@ qemu-kvm -net nic,model=? /dev/null
<target dev='vnet0'/> <target dev='vnet0'/>
<b>&lt;ip family='ipv4' address='192.168.122.5' prefix='24'/&gt;</b> <b>&lt;ip family='ipv4' address='192.168.122.5' prefix='24'/&gt;</b>
&lt;/interface&gt; &lt;/interface&gt;
...
&lt;hostdev mode='capabilities' type='net'&gt;
&lt;source&gt;
&lt;interface&gt;eth0&lt;/interface&gt;
&lt;/source&gt;
<b>&lt;ip family='ipv4' address='192.168.122.6' prefix='24'/&gt;</b>
&lt;/hostdev&gt;
&lt;/devices&gt; &lt;/devices&gt;
... ...
</pre> </pre>

View File

@ -3808,11 +3808,31 @@
<attribute name="type"> <attribute name="type">
<value>net</value> <value>net</value>
</attribute> </attribute>
<element name="source"> <interleave>
<element name="interface"> <element name="source">
<ref name="deviceName"/> <element name="interface">
<ref name="deviceName"/>
</element>
</element> </element>
</element> <zeroOrMore>
<element name="ip">
<attribute name="address">
<ref name="ipAddr"/>
</attribute>
<optional>
<attribute name="family">
<ref name="addr-family"/>
</attribute>
</optional>
<optional>
<attribute name="prefix">
<ref name="ipPrefix"/>
</attribute>
</optional>
<empty/>
</element>
</zeroOrMore>
</interleave>
</define> </define>
<define name="usbproduct"> <define name="usbproduct">

View File

@ -1818,6 +1818,8 @@ virDomainHostdevSubsysSCSIiSCSIClear(virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc
void virDomainHostdevDefClear(virDomainHostdevDefPtr def) void virDomainHostdevDefClear(virDomainHostdevDefPtr def)
{ {
size_t i;
if (!def) if (!def)
return; return;
@ -1842,6 +1844,9 @@ void virDomainHostdevDefClear(virDomainHostdevDefPtr def)
break; break;
case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET: case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET:
VIR_FREE(def->source.caps.u.net.iface); VIR_FREE(def->source.caps.u.net.iface);
for (i = 0; i < def->source.caps.u.net.nips; i++)
VIR_FREE(def->source.caps.u.net.ips[i]);
VIR_FREE(def->source.caps.u.net.ips);
break; break;
} }
break; break;
@ -4833,6 +4838,8 @@ virDomainHostdevDefParseXMLCaps(xmlNodePtr node ATTRIBUTE_UNUSED,
virDomainHostdevDefPtr def) virDomainHostdevDefPtr def)
{ {
xmlNodePtr sourcenode; xmlNodePtr sourcenode;
xmlNodePtr *ipnodes = NULL;
int nipnodes;
int ret = -1; int ret = -1;
/* @type is passed in from the caller rather than read from the /* @type is passed in from the caller rather than read from the
@ -4887,6 +4894,26 @@ virDomainHostdevDefParseXMLCaps(xmlNodePtr node ATTRIBUTE_UNUSED,
_("Missing <interface> element in hostdev net device")); _("Missing <interface> element in hostdev net device"));
goto error; goto error;
} }
/* Parse possible IP addresses */
if ((nipnodes = virXPathNodeSet("./ip", ctxt, &ipnodes)) < 0)
goto error;
if (nipnodes) {
size_t i;
for (i = 0; i < nipnodes; i++) {
virDomainNetIpDefPtr ip = virDomainNetIpParseXML(ipnodes[i]);
if (!ip)
goto error;
if (VIR_APPEND_ELEMENT(def->source.caps.u.net.ips,
def->source.caps.u.net.nips, ip) < 0) {
VIR_FREE(ip);
goto error;
}
}
}
break; break;
default: default:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@ -4896,6 +4923,7 @@ virDomainHostdevDefParseXMLCaps(xmlNodePtr node ATTRIBUTE_UNUSED,
} }
ret = 0; ret = 0;
error: error:
VIR_FREE(ipnodes);
return ret; return ret;
} }
@ -17302,6 +17330,12 @@ virDomainHostdevDefFormatCaps(virBufferPtr buf,
virBufferAdjustIndent(buf, -2); virBufferAdjustIndent(buf, -2);
virBufferAddLit(buf, "</source>\n"); virBufferAddLit(buf, "</source>\n");
if (def->source.caps.type == VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET) {
virDomainNetIpsFormat(buf, def->source.caps.u.net.ips,
def->source.caps.u.net.nips);
}
return 0; return 0;
} }

View File

@ -498,6 +498,8 @@ struct _virDomainHostdevCaps {
} misc; } misc;
struct { struct {
char *iface; char *iface;
size_t nips;
virDomainNetIpDefPtr *ips;
} net; } net;
} u; } u;
}; };

View File

@ -35,6 +35,8 @@
<source> <source>
<interface>eth0</interface> <interface>eth0</interface>
</source> </source>
<ip address='192.168.122.2' family='ipv4'/>
<ip address='2003:db8:1:0:214:1234:fe0b:3596' family='ipv6' prefix='24'/>
</hostdev> </hostdev>
</devices> </devices>
</domain> </domain>