On 11/10/2011 06:28 AM, Daniel P. Berrange wrote:
From: "Daniel P. Berrange"<berrange(a)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