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