[libvirt] [PATCH 2/4] Refactor LXC network setup to allow future enhancements
Stefan Berger
stefanb at linux.vnet.ibm.com
Thu Nov 10 13:58:21 UTC 2011
On 11/10/2011 06:28 AM, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange"<berrange at redhat.com>
>
> The current lxcSetupInterfaces() method directly performs setup
> of the bridge devices. Since it will shortly need to also create
> macvlan devices, move the bridge related code into a separate
> method
>
> * src/lxc/lxc_driver.c: Split lxcSetupInterfaces() to create a
> new lxcSetupInterfaceBridge()
> ---
> src/lxc/lxc_driver.c | 167 +++++++++++++++++++++++++++++--------------------
> 1 files changed, 99 insertions(+), 68 deletions(-)
>
> diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
> index ccd8bad..4f6807b 100644
> --- a/src/lxc/lxc_driver.c
> +++ b/src/lxc/lxc_driver.c
> @@ -1175,6 +1175,61 @@ static void lxcVmCleanup(lxc_driver_t *driver,
> }
> }
>
> +
> +static int lxcSetupInterfaceBridged(virConnectPtr conn,
> + virDomainNetDefPtr net,
> + const char *brname,
> + unsigned int *nveths,
> + char ***veths)
> +{
> + int ret = -1;
> + char *parentVeth;
> + char *containerVeth = NULL;
> +
> + VIR_DEBUG("calling vethCreate()");
> + parentVeth = net->ifname;
> + if (virNetDevVethCreate(&parentVeth,&containerVeth)< 0)
> + goto cleanup;
> + VIR_DEBUG("parentVeth: %s, containerVeth: %s", parentVeth, containerVeth);
> +
> + if (net->ifname == NULL)
> + net->ifname = parentVeth;
> +
> + if (VIR_REALLOC_N(*veths, (*nveths)+1)< 0) {
> + virReportOOMError();
> + VIR_FREE(containerVeth);
> + goto cleanup;
> + }
> + (*veths)[(*nveths)] = containerVeth;
> + (*nveths)++;
> +
> + if (virNetDevSetMAC(containerVeth, net->mac)< 0)
> + goto cleanup;
> +
> + if (virNetDevBridgeAddPort(brname, parentVeth)< 0)
> + goto cleanup;
> +
> + if (virNetDevSetOnline(parentVeth, true)< 0)
> + goto cleanup;
> +
> + if (virNetDevBandwidthSet(net->ifname,
> + virDomainNetGetActualBandwidth(net))< 0) {
> + lxcError(VIR_ERR_INTERNAL_ERROR,
> + _("cannot set bandwidth limits on %s"),
> + net->ifname);
> + goto cleanup;
> + }
> +
> + if (net->filter&&
> + virDomainConfNWFilterInstantiate(conn, net)< 0)
> + goto cleanup;
> +
> + ret = 0;
> +
> +cleanup:
> + return ret;
> +}
> +
> /**
> * lxcSetupInterfaces:
> * @conn: pointer to connection
> @@ -1193,39 +1248,56 @@ static int lxcSetupInterfaces(virConnectPtr conn,
> unsigned int *nveths,
> char ***veths)
> {
> - int rc = -1, i;
> - char *bridge = NULL;
> + int ret = -1;
> + size_t i;
>
> for (i = 0 ; i< def->nnets ; i++) {
> - char *parentVeth;
> - char *containerVeth = NULL;
> -
> /* If appropriate, grab a physical device from the configured
> * network's pool of devices, or resolve bridge device name
> * to the one defined in the network definition.
> */
> if (networkAllocateActualDevice(def->nets[i])< 0)
> - goto error_exit;
> + goto cleanup;
>
> switch (virDomainNetGetActualType(def->nets[i])) {
> - case VIR_DOMAIN_NET_TYPE_NETWORK:
> - {
> + case VIR_DOMAIN_NET_TYPE_NETWORK: {
> virNetworkPtr network;
> + char *brname = NULL;
>
> - network = virNetworkLookupByName(conn,
> - def->nets[i]->data.network.name);
> - if (!network) {
> - goto error_exit;
> - }
> -
> - bridge = virNetworkGetBridgeName(network);
> + if (!(network = virNetworkLookupByName(conn,
> + def->nets[i]->data.network.name)))
> + goto cleanup;
>
> + brname = virNetworkGetBridgeName(network);
> virNetworkFree(network);
> + if (!brname)
> + goto cleanup;
> +
> + if (lxcSetupInterfaceBridged(conn,
> + def->nets[i],
> + brname,
> + nveths,
> + veths)< 0) {
> + VIR_FREE(brname);
> + goto cleanup;
> + }
> + VIR_FREE(brname);
> break;
> }
> - case VIR_DOMAIN_NET_TYPE_BRIDGE:
> - bridge = virDomainNetGetActualBridgeName(def->nets[i]);
> - break;
> + case VIR_DOMAIN_NET_TYPE_BRIDGE: {
> + const char *brname = virDomainNetGetActualBridgeName(def->nets[i]);
> + if (!brname) {
> + lxcError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("No bridge name specified"));
> + goto cleanup;
> + }
> + if (lxcSetupInterfaceBridged(conn,
> + def->nets[i],
> + brname,
> + nveths,
> + veths)< 0)
> + goto cleanup;
> + } break;
>
> case VIR_DOMAIN_NET_TYPE_USER:
> case VIR_DOMAIN_NET_TYPE_ETHERNET:
> @@ -1235,64 +1307,23 @@ static int lxcSetupInterfaces(virConnectPtr conn,
> case VIR_DOMAIN_NET_TYPE_INTERNAL:
> case VIR_DOMAIN_NET_TYPE_DIRECT:
> case VIR_DOMAIN_NET_TYPE_LAST:
> - break;
> - }
> -
> - VIR_DEBUG("bridge: %s", bridge);
> - if (NULL == bridge) {
> lxcError(VIR_ERR_INTERNAL_ERROR,
> - "%s", _("Failed to get bridge for interface"));
> - goto error_exit;
> - }
> -
> - VIR_DEBUG("calling vethCreate()");
> - parentVeth = def->nets[i]->ifname;
> - if (virNetDevVethCreate(&parentVeth,&containerVeth)< 0)
> - goto error_exit;
> - VIR_DEBUG("parentVeth: %s, containerVeth: %s", parentVeth, containerVeth);
> -
> - if (NULL == def->nets[i]->ifname) {
> - def->nets[i]->ifname = parentVeth;
> - }
> -
> - if (VIR_REALLOC_N(*veths, (*nveths)+1)< 0) {
> - virReportOOMError();
> - VIR_FREE(containerVeth);
> - goto error_exit;
> - }
> - (*veths)[(*nveths)] = containerVeth;
> - (*nveths)++;
> -
> - if (virNetDevSetMAC(containerVeth, def->nets[i]->mac)< 0)
> - goto error_exit;
> -
> - if (virNetDevBridgeAddPort(bridge, parentVeth)< 0)
> - goto error_exit;
> -
> - if (virNetDevSetOnline(parentVeth, true)< 0)
> - goto error_exit;
> -
> - if (virNetDevBandwidthSet(def->nets[i]->ifname,
> - virDomainNetGetActualBandwidth(def->nets[i]))< 0) {
> - lxcError(VIR_ERR_INTERNAL_ERROR,
> - _("cannot set bandwidth limits on %s"),
> - def->nets[i]->ifname);
> - goto error_exit;
> + _("Unsupported network type %s"),
> + virDomainNetTypeToString(
> + virDomainNetGetActualType(def->nets[i])
> + ));
> + goto cleanup;
> }
> -
> - if (def->nets[i]->filter&&
> - virDomainConfNWFilterInstantiate(conn, def->nets[i])< 0)
> - goto error_exit;
> }
>
> - rc = 0;
> + ret= 0;
>
> -error_exit:
> - if (rc != 0) {
> +cleanup:
> + if (ret != 0) {
> for (i = 0 ; i< def->nnets ; i++)
> networkReleaseActualDevice(def->nets[i]);
> }
> - return rc;
> + return ret;
> }
>
>
ACK
More information about the libvir-list
mailing list