The patch adds generic ethernet type to LXC, that allows you to make
an arbitrary virtual network interface and associate it to an LXC
domain. That does not, however, provide a means to execute a script,
that is still available only for QEMU.
1. Create a virtual ethernet device pair
# ip link add type veth (e.g. veth0 and veth1 by default)
2. Define a LXC domain and associate it to one end of the pair
[...]
<interface type='ethernet'>
<target dev='veth1'/>
</interface>
3. Do whatever you like, for example, add another end of the pair
to a bridge (e.g. br0)
# brctr addif br0 veth0
# ip link set dev veth0 up
4. Start a LXC domain. The interface shows up as eth0 in the domain.
Signed-off-by: Takayuki Usui <takayuki(a)midokura.jp>
---
src/lxc/lxc_process.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 49 insertions(+), 1 deletion(-)
diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c
index 84128d1..0b86241 100644
--- a/src/lxc/lxc_process.c
+++ b/src/lxc/lxc_process.c
@@ -419,6 +419,46 @@ cleanup:
}
+static int lxcSetupInterfaceEthernet(virConnectPtr conn ATTRIBUTE_UNUSED,
+ virDomainDefPtr def ATTRIBUTE_UNUSED,
+ virDomainNetDefPtr net,
+ unsigned int *nveths,
+ char ***veths)
+{
+ int ret = -1;
+ char *containerVeth = NULL;
+
+ if (net->ifname == 0 || strlen(net->ifname) == 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Ethernet target device is required"));
+ goto cleanup;
+ }
+
+ if (VIR_ALLOC_N(containerVeth, strlen(net->ifname) + 1) < 0) {
+ virReportOOMError();
+ goto cleanup;
+ }
+ if (VIR_REALLOC_N(*veths, (*nveths)+1) < 0) {
+ virReportOOMError();
+ VIR_FREE(containerVeth);
+ goto cleanup;
+ }
+ if (virStrcpy(containerVeth, net->ifname,
+ strlen(net->ifname) + 1) == NULL) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Ethernet target device name is too long"));
+ VIR_FREE(containerVeth);
+ goto cleanup;
+ }
+ (*veths)[(*nveths)] = containerVeth;
+ (*nveths)++;
+
+ ret = 0;
+
+cleanup:
+ return ret;
+}
+
/**
* virLXCProcessSetupInterfaces:
* @conn: pointer to connection
@@ -522,8 +562,16 @@ static int virLXCProcessSetupInterfaces(virConnectPtr conn,
goto cleanup;
break;
- case VIR_DOMAIN_NET_TYPE_USER:
case VIR_DOMAIN_NET_TYPE_ETHERNET:
+ if (lxcSetupInterfaceEthernet(conn,
+ def,
+ def->nets[i],
+ nveths,
+ veths) < 0)
+ goto cleanup;
+ break;
+
+ case VIR_DOMAIN_NET_TYPE_USER:
case VIR_DOMAIN_NET_TYPE_SERVER:
case VIR_DOMAIN_NET_TYPE_CLIENT:
case VIR_DOMAIN_NET_TYPE_MCAST:
--
1.7.9.5