[libvirt] [PATCH 4/4] network: backend for virNetworkUpdate of interface list
Peter Krempa
pkrempa at redhat.com
Fri Sep 21 20:45:48 UTC 2012
On 09/21/12 21:46, Laine Stump wrote:
> <interface> elements are location inside the <forward> element of a
> network. There is only one <forward> element in any network, but it
> might have many <interface> elements. This element only contains a
> single attribute, "dev", which is the name of a network device
> (e.g. "eth0").
>
> Since there is only a single attribute, the modify operation isn't
> supported for this "section", only add-first, add-last, and
> delete. Also, note that it's not permitted to delete an interface from
> the list while any guest is using it. We may later decide this is safe
> (because removing it from the list really only excludes it from
> consideration in future guest allocations of interfaces, but doesn't
> affect any guests currently connected), but for now this limitation
> seems prudent (of course when changing the persistent config, this
> limitation doesn't apply, because the persistent config doesn't
> support the concept of "in used").
s/used/use/
>
> Another limitation - it is also possible for the interfraces in this
s/interfraces/interfaces/
> list to be described by PCI address rather than netdev name. However,
> I noticed while writing this function that we currently don't support
> defining interfaces that way in config - the only method of getting
> interfaces specified as <adress type='pci' ..../> instead of
s/adress/address/
> <interface dev='xx'/> is to provide a <pf dev='yy'/> element under
> forward, and let the entries in the interface list be automatically
> populated with the virtual functions (VF) of the physical function
> device given in <pg>.
>
> As with the other virNetworkUpdate section backends, support for this
> section is completely contained within a single static function, no
> other changes were required, and only functions already called from
> elsewhere within the same file are used in the new content for this
> existing function (i.e., adding this code should not cause a new build
> problem on any platform).
> ---
> src/conf/network_conf.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 94 insertions(+), 2 deletions(-)
>
> diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
> index a2d82d4..4f853e3 100644
> --- a/src/conf/network_conf.c
> +++ b/src/conf/network_conf.c
> @@ -2620,8 +2620,100 @@ virNetworkDefUpdateForwardInterface(virNetworkDefPtr def,
> /* virNetworkUpdateFlags */
> unsigned int fflags ATTRIBUTE_UNUSED)
In the function header there are multiple arguments marked as unused,
but the new code uses them. You should unmark "command" and "ctxt" as
unused.
> {
> - virNetworkDefUpdateNoSupport(def, "forward interface");
> - return -1;
> + int ii, ret = -1;
> + virNetworkForwardIfDef iface;
> +
> + memset(&iface, 0, sizeof(iface));
> +
> + if (virNetworkDefUpdateCheckElementName(def, ctxt->node, "interface") < 0)
> + goto cleanup;
> +
> + if (command == VIR_NETWORK_UPDATE_COMMAND_MODIFY) {
> + virReportError(VIR_ERR_NO_SUPPORT, "%s",
> + _("forward interface entries cannot be modified, "
> + "only added or deleted"));
> + goto cleanup;
> + }
> +
> + /* parsing this is so simple that it doesn't have its own function */
> + iface.type = VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_NETDEV;
> + if (!(iface.device.dev = virXMLPropString(ctxt->node, "dev"))) {
> + virReportError(VIR_ERR_XML_ERROR, "%s",
> + _("missing dev attribute in <interface> element"));
goto cleanup; missing?
> + }
> +
> + /* check if an <interface> with same dev name already exists */
> + for (ii = 0; ii < def->nForwardIfs; ii++) {
> + if (def->forwardIfs[ii].type
> + == VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_NETDEV &&
I'd rather have a >80 cols line than break expressions in half. But this
isn't really relevant to discuss in context of this patch.
> + STREQ(iface.device.dev, def->forwardIfs[ii].device.dev))
> + break;
> + }
> +
> + if ((command == VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST) ||
> + (command == VIR_NETWORK_UPDATE_COMMAND_ADD_LAST)) {
> +
> + if (ii < def->nForwardIfs) {
> + virReportError(VIR_ERR_OPERATION_INVALID,
> + _("there is an existing interface entry "
> + "in network '%s' that matches "
> + "\"<interface dev='%s'>\""),
> + def->name, iface.device.dev);
> + goto cleanup;
> + }
> +
> + /* add to beginning/end of list */
> + if (VIR_REALLOC_N(def->forwardIfs, def->nForwardIfs +1) < 0) {
Add space after +.
> + virReportOOMError();
> + goto cleanup;
> + }
> +
> + if (command == VIR_NETWORK_UPDATE_COMMAND_ADD_LAST) {
> + def->forwardIfs[def->nForwardIfs] = iface;
> + } else { /* implied (command == VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST) */
> + memmove(def->forwardIfs + 1, def->forwardIfs,
> + sizeof(*def->forwardIfs) * def->nForwardIfs);
> + def->forwardIfs[0] = iface;
> + }
> + def->nForwardIfs++;
> + memset(&iface, 0, sizeof(iface));
> +
> + } else if (command == VIR_NETWORK_UPDATE_COMMAND_DELETE) {
> +
> + if (ii == def->nForwardIfs) {
> + virReportError(VIR_ERR_OPERATION_INVALID,
> + _("couldn't find an interface entry "
> + "in network '%s' matching <interface dev='%s'>"),
> + def->name, iface.device.dev);
> + goto cleanup;
> + }
> +
> + /* fail if the interface is being used */
> + if (def->forwardIfs[ii].connections > 0) {
> + virReportError(VIR_ERR_OPERATION_INVALID,
> + _("unable to delete interface '%s' "
> + "in network '%s'. It is currently being used "
> + " by %d domains."),
> + iface.device.dev, def->name,
> + def->forwardIfs[ii].connections);
> + goto cleanup;
> + }
> +
> + /* remove it */
> + virNetworkForwardIfDefClear(&def->forwardIfs[ii]);
> + memmove(def->forwardIfs + ii, def->forwardIfs + ii + 1,
> + sizeof(*def->forwardIfs) * (def->nForwardIfs - ii - 1));
> + def->nForwardIfs--;
> + ignore_value(VIR_REALLOC_N(def->forwardIfs, def->nForwardIfs));
> + } else {
> + virNetworkDefUpdateUnknownCommand(command);
> + goto cleanup;
> + }
> +
> + ret = 0;
> +cleanup:
> + virNetworkForwardIfDefClear(&iface);
> + return ret;
> }
>
> static int
>
ACK with the nits fixed.
Peter
More information about the libvir-list
mailing list