On Fri, Oct 10, 2014 at 02:03:57PM +0200, Cédric Bosdonnat wrote: > --- > docs/formatdomain.html.in | 12 +++++++-- > docs/schemas/domaincommon.rng | 23 +++++++++++++++--- > src/conf/domain_conf.c | 47 ++++++++++++++++++++++++++++++++++++ > src/conf/domain_conf.h | 2 ++ > tests/lxcxml2xmldata/lxc-hostdev.xml | 2 ++ > 5 files changed, 80 insertions(+), 6 deletions(-) > > diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in > index 8e3a522..e07a298 100644 > --- a/docs/formatdomain.html.in > +++ b/docs/formatdomain.html.in > @@ -4249,13 +4249,21 @@ qemu-kvm -net nic,model=? /dev/null > <target dev='vnet0'/> > <b><ip address='192.168.122.5' prefix='24'/></b> > </interface> > + ... > + <hostdev mode='capabilities' type='net'> > + <source> > + <interface>eth0</interface> > + </source> > + <b><ip address='192.168.122.6' prefix='24'/></b> > + </hostdev> > + > </devices> > ... > </pre> > > <p> > - <span class="since">Since 1.2.10</span> the network devices can be provided > - zero or more IP addresses to set > + <span class="since">Since 1.2.10</span> the network devices and host devices > + with network capabilities can be provided zero or more IP addresses to set > on the target device. Note that some hypervisors or network device types > will simply ignore them or only use the first one. The <code>address</code> > attribute can hold either an IPv4 or IPv6 address. The <code>prefix</code> > diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng > index a82d705..5d955b0 100644 > --- a/docs/schemas/domaincommon.rng > +++ b/docs/schemas/domaincommon.rng > @@ -3769,11 +3769,26 @@ > <attribute name="type"> > <value>net</value> > </attribute> > - <element name="source"> > - <element name="interface"> > - <ref name="deviceName"/> > + <interleave> > + <element name="source"> > + <element name="interface"> > + <ref name="deviceName"/> > + </element> > </element> > - </element> > + <zeroOrMore> > + <element name="ip"> > + <attribute name="address"> > + <ref name="ipAddr"/> > + </attribute> > + <optional> > + <attribute name="prefix"> > + <ref name="ipPrefix"/> > + </attribute> > + </optional> > + <empty/> > + </element> > + </zeroOrMore> > + </interleave> > </define> > > <define name="usbproduct"> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c > index c7ab962..f39be87 100644 > --- a/src/conf/domain_conf.c > +++ b/src/conf/domain_conf.c > @@ -1776,6 +1776,8 @@ virDomainHostdevSubsysSCSIiSCSIClear(virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc > > void virDomainHostdevDefClear(virDomainHostdevDefPtr def) > { > + size_t i; > + > if (!def) > return; > > @@ -1800,6 +1802,9 @@ void virDomainHostdevDefClear(virDomainHostdevDefPtr def) > break; > case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET: > VIR_FREE(def->source.caps.u.net.iface); > + for (i = 0; i < def->source.caps.u.net.nips; i++) > + virDomainNetIpDefFree(def->source.caps.u.net.ips[i]); > + VIR_FREE(def->source.caps.u.net.ips); > break; > } > break; > @@ -4678,6 +4683,8 @@ virDomainHostdevDefParseXMLCaps(xmlNodePtr node ATTRIBUTE_UNUSED, > virDomainHostdevDefPtr def) > { > xmlNodePtr sourcenode; > + xmlNodePtr *ipnodes = NULL; > + int nipnodes; > int ret = -1; > > /* @type is passed in from the caller rather than read from the > @@ -4732,6 +4739,40 @@ virDomainHostdevDefParseXMLCaps(xmlNodePtr node ATTRIBUTE_UNUSED, > _("Missing <interface> element in hostdev net device")); > 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++) { > + char *prefixStr = NULL; > + virDomainNetIpDefPtr ip = NULL; > + > + if (VIR_ALLOC(ip) < 0) > + goto error; > + > + ip->address = virXMLPropString(ipnodes[i], "address"); > + > + if ((prefixStr = virXMLPropString(ipnodes[i], "prefix")) && > + (virStrToLong_ui(prefixStr, NULL, 10, &ip->prefix) < 0)) { > + > + virReportError(VIR_ERR_INVALID_ARG, > + _("Invalid network prefix: '%s'"), > + prefixStr); > + VIR_FREE(prefixStr); > + goto error; > + } > + VIR_FREE(prefixStr); > + > + if (ip->address != NULL && > + VIR_APPEND_ELEMENT(def->source.caps.u.net.ips, > + def->source.caps.u.net.nips, ip) < 0) > + goto error; > + } > + VIR_FREE(ipnodes); > + } It would be nice if we can share the parsing of this with the parsingdone in the <network> xml block. Since the XML schema is the same, I'd expect we can have a single function that contains everything from the virXPathNodeSet("./ip") onwards. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list