<div dir="ltr"><div>Hi Laine <br><br><br></div>The above patch of interface type="ethernet" is for which libvirt version?<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, May 16, 2016 at 9:51 PM, Laine Stump <span dir="ltr"><<a href="mailto:laine@laine.org" target="_blank">laine@laine.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This is identical to type='bridge', but without the "connect to a<br>
bridge" part, so it can be handled by using the same functions (and<br>
often even the same cases in switch statements), after renaming<br>
virLXCProcessSetupInterfaceBridged() to virLXCProcessInterfaceTap()<br>
and enhancing it to skip bridge-related items when brname == NULL.<br>
<br>
To be truly useful, we need to support setting the ip address on the<br>
host side veth as well as guest side veth (already supported for<br>
type='bridge'), as well as setting the peer address for both.<br>
<br>
The <script> element isn't supported in this patch because I have no<br>
need for it. I'd rather add it after determining it's needed rather<br>
than adding it for no reason and than being required to support it<br>
forever.<br>
---<br>
<br>
I wrote this mostly so that I could experiment with setting the peer<br>
addresses of both sides of the veth pair to see what was usable and<br>
what we needed to support in terms of setting IP addresses. I had<br>
intended to post this patch along with patches to re-enable the peer<br>
address setting patches that I reverted just before 1.3.4 was<br>
released, but decided that having lxc <interface type='ethernet'><br>
already in might help in any discussion we had about that (since it<br>
gives everyone a working example where libvirt has control of both the<br>
host-side and guest-side interface config.<br>
<br>
This will of course be much more useful once the IP addresses can be<br>
set from within libvirt, but all code that is here will remain and, as<br>
I said above, it provides a useful platform for experimentation.<br>
<br>
 src/lxc/lxc_controller.c                          |  4 +-<br>
 src/lxc/lxc_driver.c                              | 16 ++++---<br>
 src/lxc/lxc_native.c                              | 15 +++----<br>
 src/lxc/lxc_process.c                             | 36 +++++++--------<br>
 src/lxc/lxc_process.h                             |  6 +--<br>
 tests/lxcconf2xmldata/lxcconf2xml-ethernet.config | 44 ++++++++++++++++++<br>
 tests/lxcconf2xmldata/lxcconf2xml-ethernet.xml    | 54 +++++++++++++++++++++++<br>
 tests/lxcconf2xmltest.c                           |  1 +<br>
 tests/lxcxml2xmldata/lxc-ethernet.xml             | 42 ++++++++++++++++++<br>
 tests/lxcxml2xmltest.c                            |  1 +<br>
 10 files changed, 181 insertions(+), 38 deletions(-)<br>
 create mode 100644 tests/lxcconf2xmldata/lxcconf2xml-ethernet.config<br>
 create mode 100644 tests/lxcconf2xmldata/lxcconf2xml-ethernet.xml<br>
 create mode 100644 tests/lxcxml2xmldata/lxc-ethernet.xml<br>
<br>
diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c<br>
index 0304354..25f28ea 100644<br>
--- a/src/lxc/lxc_controller.c<br>
+++ b/src/lxc/lxc_controller.c<br>
@@ -1,5 +1,5 @@<br>
 /*<br>
- * Copyright (C) 2010-2015 Red Hat, Inc.<br>
+ * Copyright (C) 2010-2016 Red Hat, Inc.<br>
  * Copyright IBM Corp. 2008<br>
  *<br>
  * lxc_controller.c: linux container process controller<br>
@@ -371,6 +371,7 @@ static int virLXCControllerGetNICIndexes(virLXCControllerPtr ctrl)<br>
         switch (ctrl->def->nets[i]->type) {<br>
         case VIR_DOMAIN_NET_TYPE_BRIDGE:<br>
         case VIR_DOMAIN_NET_TYPE_NETWORK:<br>
+        case VIR_DOMAIN_NET_TYPE_ETHERNET:<br>
             if (ctrl->def->nets[i]->ifname == NULL)<br>
                 continue;<br>
             if (virNetDevGetIndex(ctrl->def->nets[i]->ifname,<br>
@@ -386,7 +387,6 @@ static int virLXCControllerGetNICIndexes(virLXCControllerPtr ctrl)<br>
             break;<br>
<br>
         case VIR_DOMAIN_NET_TYPE_USER:<br>
-        case VIR_DOMAIN_NET_TYPE_ETHERNET:<br>
         case VIR_DOMAIN_NET_TYPE_VHOSTUSER:<br>
         case VIR_DOMAIN_NET_TYPE_SERVER:<br>
         case VIR_DOMAIN_NET_TYPE_CLIENT:<br>
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c<br>
index a226850..f811053 100644<br>
--- a/src/lxc/lxc_driver.c<br>
+++ b/src/lxc/lxc_driver.c<br>
@@ -1,5 +1,5 @@<br>
 /*<br>
- * Copyright (C) 2010-2015 Red Hat, Inc.<br>
+ * Copyright (C) 2010-2016 Red Hat, Inc.<br>
  * Copyright IBM Corp. 2008<br>
  *<br>
  * lxc_driver.c: linux container driver functions<br>
@@ -4225,15 +4225,15 @@ lxcDomainAttachDeviceNetLive(virConnectPtr conn,<br>
                            _("No bridge name specified"));<br>
             goto cleanup;<br>
         }<br>
-        if (!(veth = virLXCProcessSetupInterfaceBridged(vm->def,<br>
-                                                        net,<br>
-                                                        brname)))<br>
+        if (!(veth = virLXCProcessSetupInterfaceTap(vm->def, net, brname)))<br>
             goto cleanup;<br>
     }   break;<br>
+    case VIR_DOMAIN_NET_TYPE_ETHERNET:<br>
+        if (!(veth = virLXCProcessSetupInterfaceTap(vm->def, net, NULL)))<br>
+            goto cleanup;<br>
+        break;<br>
     case VIR_DOMAIN_NET_TYPE_DIRECT: {<br>
-        if (!(veth = virLXCProcessSetupInterfaceDirect(conn,<br>
-                                                       vm->def,<br>
-                                                       net)))<br>
+        if (!(veth = virLXCProcessSetupInterfaceDirect(conn, vm->def, net)))<br>
             goto cleanup;<br>
     }   break;<br>
     default:<br>
@@ -4270,6 +4270,7 @@ lxcDomainAttachDeviceNetLive(virConnectPtr conn,<br>
         switch (actualType) {<br>
         case VIR_DOMAIN_NET_TYPE_BRIDGE:<br>
         case VIR_DOMAIN_NET_TYPE_NETWORK:<br>
+        case VIR_DOMAIN_NET_TYPE_ETHERNET:<br>
             ignore_value(virNetDevVethDelete(veth));<br>
             break;<br>
<br>
@@ -4695,6 +4696,7 @@ lxcDomainDetachDeviceNetLive(virDomainObjPtr vm,<br>
     switch (actualType) {<br>
     case VIR_DOMAIN_NET_TYPE_BRIDGE:<br>
     case VIR_DOMAIN_NET_TYPE_NETWORK:<br>
+    case VIR_DOMAIN_NET_TYPE_ETHERNET:<br>
         if (virNetDevVethDelete(detach->ifname) < 0) {<br>
             virDomainAuditNet(vm, detach, NULL, "detach", false);<br>
             goto cleanup;<br>
diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c<br>
index 31ffce7..0bea32e 100644<br>
--- a/src/lxc/lxc_native.c<br>
+++ b/src/lxc/lxc_native.c<br>
@@ -360,14 +360,13 @@ lxcCreateNetDef(const char *type,<br>
         net->mac = macAddr;<br>
<br>
     if (STREQ(type, "veth")) {<br>
-        if (!linkdev)<br>
-            goto error;<br>
-<br>
-        net->type = VIR_DOMAIN_NET_TYPE_BRIDGE;<br>
-<br>
-        if (VIR_STRDUP(net->data.bridge.brname, linkdev) < 0)<br>
-            goto error;<br>
-<br>
+        if (linkdev) {<br>
+            net->type = VIR_DOMAIN_NET_TYPE_BRIDGE;<br>
+            if (VIR_STRDUP(net->data.bridge.brname, linkdev) < 0)<br>
+                goto error;<br>
+        } else {<br>
+            net->type = VIR_DOMAIN_NET_TYPE_ETHERNET;<br>
+        }<br>
     } else if (STREQ(type, "macvlan")) {<br>
         net->type = VIR_DOMAIN_NET_TYPE_DIRECT;<br>
<br>
diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c<br>
index 8981d9a..f8a0c32 100644<br>
--- a/src/lxc/lxc_process.c<br>
+++ b/src/lxc/lxc_process.c<br>
@@ -256,9 +256,9 @@ static void virLXCProcessCleanup(virLXCDriverPtr driver,<br>
 }<br>
<br>
<br>
-char *virLXCProcessSetupInterfaceBridged(virDomainDefPtr vm,<br>
-                                         virDomainNetDefPtr net,<br>
-                                         const char *brname)<br>
+char *virLXCProcessSetupInterfaceTap(virDomainDefPtr vm,<br>
+                                     virDomainNetDefPtr net,<br>
+                                     const char *brname)<br>
 {<br>
     char *ret = NULL;<br>
     char *parentVeth;<br>
@@ -277,13 +277,15 @@ char *virLXCProcessSetupInterfaceBridged(virDomainDefPtr vm,<br>
     if (virNetDevSetMAC(containerVeth, &net->mac) < 0)<br>
         goto cleanup;<br>
<br>
-    if (vport && vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH) {<br>
-        if (virNetDevOpenvswitchAddPort(brname, parentVeth, &net->mac,<br>
-                                        vm->uuid, vport, virDomainNetGetActualVlan(net)) < 0)<br>
-            goto cleanup;<br>
-    } else {<br>
-        if (virNetDevBridgeAddPort(brname, parentVeth) < 0)<br>
-            goto cleanup;<br>
+    if (brname) {<br>
+        if (vport && vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH) {<br>
+            if (virNetDevOpenvswitchAddPort(brname, parentVeth, &net->mac, vm->uuid,<br>
+                                            vport, virDomainNetGetActualVlan(net)) < 0)<br>
+                goto cleanup;<br>
+        } else {<br>
+            if (virNetDevBridgeAddPort(brname, parentVeth) < 0)<br>
+                goto cleanup;<br>
+        }<br>
     }<br>
<br>
     if (virNetDevSetOnline(parentVeth, true) < 0)<br>
@@ -546,20 +548,18 @@ static int virLXCProcessSetupInterfaces(virConnectPtr conn,<br>
                                _("No bridge name specified"));<br>
                 goto cleanup;<br>
             }<br>
-            if (!(veth = virLXCProcessSetupInterfaceBridged(def,<br>
-                                                            net,<br>
-                                                            brname)))<br>
+            if (!(veth = virLXCProcessSetupInterfaceTap(def, net, brname)))<br>
                 goto cleanup;<br>
         }   break;<br>
-<br>
+        case VIR_DOMAIN_NET_TYPE_ETHERNET:<br>
+            if (!(veth = virLXCProcessSetupInterfaceTap(def, net, NULL)))<br>
+                goto cleanup;<br>
+            break;<br>
         case VIR_DOMAIN_NET_TYPE_DIRECT:<br>
-            if (!(veth = virLXCProcessSetupInterfaceDirect(conn,<br>
-                                                           def,<br>
-                                                           net)))<br>
+            if (!(veth = virLXCProcessSetupInterfaceDirect(conn, def, net)))<br>
                 goto cleanup;<br>
             break;<br>
<br>
-        case VIR_DOMAIN_NET_TYPE_ETHERNET:<br>
         case VIR_DOMAIN_NET_TYPE_USER:<br>
         case VIR_DOMAIN_NET_TYPE_VHOSTUSER:<br>
         case VIR_DOMAIN_NET_TYPE_SERVER:<br>
diff --git a/src/lxc/lxc_process.h b/src/lxc/lxc_process.h<br>
index b6c8083..fcb50a8 100644<br>
--- a/src/lxc/lxc_process.h<br>
+++ b/src/lxc/lxc_process.h<br>
@@ -47,9 +47,9 @@ void virLXCProcessAutostartAll(virLXCDriverPtr driver);<br>
 int virLXCProcessReconnectAll(virLXCDriverPtr driver,<br>
                               virDomainObjListPtr doms);<br>
<br>
-char *virLXCProcessSetupInterfaceBridged(virDomainDefPtr vm,<br>
-                                         virDomainNetDefPtr net,<br>
-                                         const char *brname);<br>
+char *virLXCProcessSetupInterfaceTap(virDomainDefPtr vm,<br>
+                                     virDomainNetDefPtr net,<br>
+                                     const char *brname);<br>
 char *virLXCProcessSetupInterfaceDirect(virConnectPtr conn,<br>
                                         virDomainDefPtr def,<br>
                                         virDomainNetDefPtr net);<br>
diff --git a/tests/lxcconf2xmldata/lxcconf2xml-ethernet.config b/tests/lxcconf2xmldata/lxcconf2xml-ethernet.config<br>
new file mode 100644<br>
index 0000000..d39917d<br>
--- /dev/null<br>
+++ b/tests/lxcconf2xmldata/lxcconf2xml-ethernet.config<br>
@@ -0,0 +1,44 @@<br>
+# Template used to create this container: opensuse<br>
+# Template script checksum (SHA-1): 27307e0a95bd81b2c0bd82d6f87fdbe83be075ef<br>
+<br>
+lxc.network.type = veth<br>
+lxc.network.flags = up<br>
+lxc.network.hwaddr = 02:00:15:8f:05:c1<br>
+<a href="http://lxc.network.name" rel="noreferrer" target="_blank">lxc.network.name</a> = eth0<br>
+lxc.network.ipv4 = <a href="http://192.168.122.2/24" rel="noreferrer" target="_blank">192.168.122.2/24</a><br>
+lxc.network.ipv4.gateway = 192.168.122.1<br>
+lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596/64<br>
+lxc.network.ipv6.gateway = 2003:db8:1:0:214:1234:fe0b:3595<br>
+<br>
+#remove next line if host DNS configuration should not be available to container<br>
+lxc.mount.entry = proc proc proc nodev,noexec,nosuid 0 0<br>
+lxc.mount.entry = sysfs sys sysfs defaults  0 0<br>
+lxc.mount.entry = tmpfs run tmpfs size=8m,mode=0755,nodev,nosuid 0 0<br>
+lxc.mount.entry = /etc/resolv.conf etc/resolv.conf none bind,ro 0 0<br>
+lxc.rootfs = /var/lib/lxc/migrate_test/rootfs<br>
+lxc.utsname = migrate_test<br>
+lxc.arch = x86<br>
+lxc.autodev=1<br>
+lxc.tty = 2<br>
+lxc.pts = 1024<br>
+lxc.cap.drop = sys_module mac_admin mac_override mknod<br>
+<br>
+# When using LXC with apparmor, uncomment the next line to run unconfined:<br>
+#lxc.aa_profile = unconfined<br>
+<br>
+lxc.cgroup.devices.deny = a<br>
+# /dev/null and zero<br>
+lxc.cgroup.devices.allow = c 1:3 rwm<br>
+lxc.cgroup.devices.allow = c 1:5 rwm<br>
+# consoles<br>
+lxc.cgroup.devices.allow = c 5:1 rwm<br>
+lxc.cgroup.devices.allow = c 5:0 rwm<br>
+lxc.cgroup.devices.allow = c 4:0 rwm<br>
+lxc.cgroup.devices.allow = c 4:1 rwm<br>
+# /dev/{,u}random<br>
+lxc.cgroup.devices.allow = c 1:9 rwm<br>
+lxc.cgroup.devices.allow = c 1:8 rwm<br>
+lxc.cgroup.devices.allow = c 136:* rwm<br>
+lxc.cgroup.devices.allow = c 5:2 rwm<br>
+# rtc<br>
+lxc.cgroup.devices.allow = c 254:0 rwm<br>
diff --git a/tests/lxcconf2xmldata/lxcconf2xml-ethernet.xml b/tests/lxcconf2xmldata/lxcconf2xml-ethernet.xml<br>
new file mode 100644<br>
index 0000000..24b017a<br>
--- /dev/null<br>
+++ b/tests/lxcconf2xmldata/lxcconf2xml-ethernet.xml<br>
@@ -0,0 +1,54 @@<br>
+<domain type='lxc'><br>
+  <name>migrate_test</name><br>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid><br>
+  <memory unit='KiB'>65536</memory><br>
+  <currentMemory unit='KiB'>65536</currentMemory><br>
+  <vcpu placement='static'>1</vcpu><br>
+  <os><br>
+    <type arch='i686'>exe</type><br>
+    <init>/sbin/init</init><br>
+  </os><br>
+  <features><br>
+    <capabilities policy='allow'><br>
+      <mac_admin state='off'/><br>
+      <mac_override state='off'/><br>
+      <mknod state='off'/><br>
+      <sys_module state='off'/><br>
+    </capabilities><br>
+  </features><br>
+  <clock offset='utc'/><br>
+  <on_poweroff>destroy</on_poweroff><br>
+  <on_reboot>restart</on_reboot><br>
+  <on_crash>destroy</on_crash><br>
+  <devices><br>
+    <emulator>/usr/libexec/libvirt_lxc</emulator><br>
+    <filesystem type='mount' accessmode='passthrough'><br>
+      <source dir='/var/lib/lxc/migrate_test/rootfs'/><br>
+      <target dir='/'/><br>
+    </filesystem><br>
+    <filesystem type='ram' accessmode='passthrough'><br>
+      <source usage='8192' units='KiB'/><br>
+      <target dir='/run'/><br>
+    </filesystem><br>
+    <filesystem type='mount' accessmode='passthrough'><br>
+      <source dir='/etc/resolv.conf'/><br>
+      <target dir='/etc/resolv.conf'/><br>
+      <readonly/><br>
+    </filesystem><br>
+    <interface type='ethernet'><br>
+      <mac address='02:00:15:8f:05:c1'/><br>
+      <ip address='192.168.122.2' family='ipv4' prefix='24'/><br>
+      <ip address='2003:db8:1:0:214:1234:fe0b:3596' family='ipv6' prefix='64'/><br>
+      <route family='ipv4' address='0.0.0.0' gateway='192.168.122.1'/><br>
+      <route family='ipv6' address='::' gateway='2003:db8:1:0:214:1234:fe0b:3595'/><br>
+      <guest dev='eth0'/><br>
+      <link state='up'/><br>
+    </interface><br>
+    <console type='pty'><br>
+      <target type='lxc' port='0'/><br>
+    </console><br>
+    <console type='pty'><br>
+      <target type='lxc' port='1'/><br>
+    </console><br>
+  </devices><br>
+</domain><br>
diff --git a/tests/lxcconf2xmltest.c b/tests/lxcconf2xmltest.c<br>
index 83895cd..7a0893e 100644<br>
--- a/tests/lxcconf2xmltest.c<br>
+++ b/tests/lxcconf2xmltest.c<br>
@@ -119,6 +119,7 @@ mymain(void)<br>
     DO_TEST("cputune", false);<br>
     DO_TEST("cpusettune", false);<br>
     DO_TEST("blkiotune", false);<br>
+    DO_TEST("ethernet", false);<br>
<br>
     virObjectUnref(xmlopt);<br>
     virObjectUnref(caps);<br>
diff --git a/tests/lxcxml2xmldata/lxc-ethernet.xml b/tests/lxcxml2xmldata/lxc-ethernet.xml<br>
new file mode 100644<br>
index 0000000..6c4a739<br>
--- /dev/null<br>
+++ b/tests/lxcxml2xmldata/lxc-ethernet.xml<br>
@@ -0,0 +1,42 @@<br>
+<domain type='lxc'><br>
+  <name>8675309</name><br>
+  <uuid>e21987a5-e98e-9c99-0e35-803e4d9ad1fe</uuid><br>
+  <memory unit='KiB'>1048576</memory><br>
+  <currentMemory unit='KiB'>1048576</currentMemory><br>
+  <vcpu placement='static'>1</vcpu><br>
+  <resource><br>
+    <partition>/machine</partition><br>
+  </resource><br>
+  <os><br>
+    <type arch='x86_64'>exe</type><br>
+    <init>/sbin/init</init><br>
+  </os><br>
+  <idmap><br>
+    <uid start='0' target='100000' count='100000'/><br>
+    <gid start='0' target='100000' count='100000'/><br>
+  </idmap><br>
+  <clock offset='utc'/><br>
+  <on_poweroff>destroy</on_poweroff><br>
+  <on_reboot>restart</on_reboot><br>
+  <on_crash>restart</on_crash><br>
+  <devices><br>
+    <emulator>/usr/libexec/libvirt_lxc</emulator><br>
+    <filesystem type='mount' accessmode='passthrough'><br>
+      <source dir='/mach/8675309'/><br>
+      <target dir='/'/><br>
+    </filesystem><br>
+    <interface type='ethernet'><br>
+      <mac address='00:16:3e:0f:ef:8a'/><br>
+      <ip address='192.168.122.12' family='ipv4' prefix='24'/><br>
+      <ip address='192.168.122.13' family='ipv4' prefix='24'/><br>
+      <route family='ipv4' address='0.0.0.0' gateway='192.168.122.1'/><br>
+      <route family='ipv4' address='192.168.124.0' prefix='24' gateway='192.168.124.1'/><br>
+      <target dev='veth0'/><br>
+      <guest dev='eth2'/><br>
+    </interface><br>
+    <console type='pty'><br>
+      <target type='lxc' port='0'/><br>
+    </console><br>
+  </devices><br>
+  <seclabel type='none'/><br>
+</domain><br>
diff --git a/tests/lxcxml2xmltest.c b/tests/lxcxml2xmltest.c<br>
index fec0142..001aa8d 100644<br>
--- a/tests/lxcxml2xmltest.c<br>
+++ b/tests/lxcxml2xmltest.c<br>
@@ -94,6 +94,7 @@ mymain(void)<br>
     DO_TEST("idmap");<br>
     DO_TEST("capabilities");<br>
     DO_TEST("sharenet");<br>
+    DO_TEST("ethernet");<br>
     DO_TEST_FULL("filesystem-root", 0, false,<br>
                  VIR_DOMAIN_DEF_PARSE_SKIP_OSTYPE_CHECKS);<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
2.5.5<br>
<br>
--<br>
libvir-list mailing list<br>
<a href="mailto:libvir-list@redhat.com">libvir-list@redhat.com</a><br>
<a href="https://www.redhat.com/mailman/listinfo/libvir-list" rel="noreferrer" target="_blank">https://www.redhat.com/mailman/listinfo/libvir-list</a><br>
</font></span></blockquote></div><br></div>