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