[libvirt] [PATCH 3/5 v3] Adding the element pf to network xml.
Daniel P. Berrange
berrange at redhat.com
Tue Jan 10 11:04:30 UTC 2012
On Wed, Dec 14, 2011 at 10:50:23AM +0000, Shradha Shah wrote:
> @@ -965,10 +971,52 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
>
> /* all of these modes can use a pool of physical interfaces */
> nForwardIfs = virXPathNodeSet("./interface", ctxt, &forwardIfNodes);
> - if (nForwardIfs < 0)
> + if (nForwardIfs <= 0) {
> + virNetworkReportError(VIR_ERR_XML_ERROR,
> + _("No interface pool given, checking for SRIOV pf"));
You don't want to be raising an error at this point, since this could still
be a success codepath, and you've got an error in the following failure path
anyway.
> + nForwardPfs = virXPathNodeSet("./pf", ctxt, &forwardPfNodes);
> +
> + if (nForwardPfs <= 0) {
> + virNetworkReportError(VIR_ERR_XML_ERROR,
> + _("No interface pool or SRIOV physical device given"));
> goto error;
Small indentation bug
> + }
> + }
>
> - if ((nForwardIfs > 0) || forwardDev) {
> + if (nForwardPfs == 1) {
> +
> + if (VIR_ALLOC_N(def->forwardPfs, nForwardPfs) < 0) {
> + virReportOOMError();
> + goto error;
> + }
> +
> + if (forwardDev) {
> + virNetworkReportError(VIR_ERR_XML_ERROR,
> + _("A forward Dev should not be used when using a SRIOV PF"));
> + goto error;
> + }
> +
> + forwardDev = virXMLPropString(*forwardPfNodes, "dev");
> + if (!forwardDev) {
> + virNetworkReportError(VIR_ERR_XML_ERROR,
> + _("Missing required dev attribute in network '%s' pf element"),
> + def->name);
> + goto error;
> + }
> +
> + def->forwardPfs->usageCount = 0;
> + def->forwardPfs->dev = forwardDev;
> + forwardDev = NULL;
> + def->nForwardPfs++;
> + }
> +
> + else if (nForwardPfs > 1) {
> + virNetworkReportError(VIR_ERR_XML_ERROR,
> + _("Use of more than one physical interface is not allowed"));
> + goto error;
> + }
> +
> + else if ((nForwardIfs > 0) || forwardDev) {
> int ii;
>
> /* allocate array to hold all the portgroups */
Same comment as previous patch about 'make syntax-check' to catch
any trailing whitespace
> @@ -1290,7 +1341,9 @@ char *virNetworkDefFormat(const virNetworkDefPtr def)
> virBufferAsprintf(&buf, " <uuid>%s</uuid>\n", uuidstr);
>
> if (def->forwardType != VIR_NETWORK_FORWARD_NONE) {
> - const char *dev = virNetworkDefForwardIf(def, 0);
> + char *dev = NULL;
> + if (def->nForwardPfs < 1)
> + dev = (char *)virNetworkDefForwardIf(def, 0);
You can avoid casting away const, by rewriting this
const char *dev = dev->nForwardPfs ? NULL : virNetworkDefForwardIf(def, 0);
> const char *mode = virNetworkForwardTypeToString(def->forwardType);
>
> if (!mode) {
> @@ -1305,6 +1358,14 @@ char *virNetworkDefFormat(const virNetworkDefPtr def)
> virBufferAsprintf(&buf, " mode='%s'%s>\n", mode,
> def->nForwardIfs ? "" : "/");
>
> +
> + if (def->nForwardPfs) {
> + if (def->forwardPfs->dev) {
I'd be slightly happier if this was written as
> + virBufferEscapeString(&buf, " <pf dev='%s'/>\n",
> + def->forwardPfs->dev);
> + }
'def->forwardPfs[0].dev'
since we have declared this as an array of devs, even if
we only allow 1 of them for now.
> + }
> +
> if (def->nForwardIfs) {
> for (ii = 0; ii < def->nForwardIfs; ii++) {
> if (def->forwardIfs[ii].dev) {
> diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h
> index 1be20f8..e25f8d3 100644
> --- a/src/conf/network_conf.h
> +++ b/src/conf/network_conf.h
> @@ -146,6 +146,9 @@ struct _virNetworkDef {
> /* If there are multiple forward devices (i.e. a pool of
> * interfaces), they will be listed here.
> */
> + size_t nForwardPfs;
> + virNetworkForwardIfDefPtr forwardPfs;
> +
> size_t nForwardIfs;
> virNetworkForwardIfDefPtr forwardIfs;
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 :|
More information about the libvir-list
mailing list