[PATCH] Network: LXC generic ethernet interface

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]