[libvirt] [PATCH] Network: LXC generic ethernet interface

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@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

On Mon, Sep 24, 2012 at 10:48:44AM +0900, Takayuki Usui wrote:
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.
Obviously the example you show here can already be accomplished using type=bridge. So I'm curious what usage scenario you need this addition for ? What type of config are you doing that is not possible using one of the non-ethernet device types ? 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 :|
participants (2)
-
Daniel P. Berrange
-
Takayuki Usui