[libvirt] [PATH lxc_support_ethernet] fix bug:lxc don't support network type of ethernet

for exmple,the xml is: <domain type = 'lxc'> ... <devices> <interface type ="ethernet"> <mac address="02:36:1d:18:2a:e4"/> <ip address='192.168.112.105' family='ipv4' prefix='24'/> <target dev="tap361d182e-14"/> </interface> <devices> </domian> when i start lxc with that xml file,system will report error and start lxc failed Now i create the veth pair and set mac address in lxc if the network type is ethernet Signed-off-by: mark zhong <zhongguocheng1@163.com> --- src/lxc/lxc_process.c | 36 ++++++++++++++++++++++++++++++++++++ src/lxc/lxc_process.h | 3 +++ 2 files changed, 39 insertions(+) diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c index 57e3880..913fe36 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -359,6 +359,39 @@ char *virLXCProcessSetupInterfaceDirect(virConnectPtr conn, return ret; } +char *virLXCProcessSetupInterfaceEthernet(virDomainDefPtr vm, + virDomainNetDefPtr net) +{ + char *ret = NULL; + char *parentVeth; + char *containerVeth = NULL; + + VIR_DEBUG("calling vethCreate()"); + parentVeth = net->ifname; + if (virNetDevVethCreate(&parentVeth, &containerVeth) < 0) + goto cleanup; + VIR_DEBUG("parentVeth: %s, containerVeth: %s", parentVeth, containerVeth); + + if (net->ifname == NULL) + net->ifname = parentVeth; + + if (virNetDevSetMAC(containerVeth, &net->mac) < 0) + goto cleanup; + + if (virNetDevSetOnline(parentVeth, true) < 0) + goto cleanup; + + if (net->filter && + virDomainConfNWFilterInstantiate(vm->uuid, net) < 0) + goto cleanup; + + ret = containerVeth; + + cleanup: + return ret; +} + + static const char *nsInfoLocal[VIR_LXC_DOMAIN_NAMESPACE_LAST] = { [VIR_LXC_DOMAIN_NAMESPACE_SHARENET] = "net", [VIR_LXC_DOMAIN_NAMESPACE_SHAREIPC] = "ipc", @@ -559,6 +592,9 @@ static int virLXCProcessSetupInterfaces(virConnectPtr conn, break; case VIR_DOMAIN_NET_TYPE_ETHERNET: + if (!(veth = virLXCProcessSetupInterfaceEthernet(def, + net))) + goto cleanup; break; case VIR_DOMAIN_NET_TYPE_USER: diff --git a/src/lxc/lxc_process.h b/src/lxc/lxc_process.h index b6c8083..3b4ade3 100644 --- a/src/lxc/lxc_process.h +++ b/src/lxc/lxc_process.h @@ -53,5 +53,8 @@ char *virLXCProcessSetupInterfaceBridged(virDomainDefPtr vm, char *virLXCProcessSetupInterfaceDirect(virConnectPtr conn, virDomainDefPtr def, virDomainNetDefPtr net); +char *virLXCProcessSetupInterfaceEthernet(virDomainDefPtr vm, + virDomainNetDefPtr net); + #endif /* __LXC_PROCESS_H__ */ -- 2.5.1.windows.1

On 12/07/2015 08:58 PM, mark zhong wrote:
for exmple,the xml is: <domain type = 'lxc'> ... <devices> <interface type ="ethernet"> <mac address="02:36:1d:18:2a:e4"/> <ip address='192.168.112.105' family='ipv4' prefix='24'/> <target dev="tap361d182e-14"/> </interface> <devices> </domian>
when i start lxc with that xml file,system will report error and start lxc failed
Showing the error is helpful sometimes...
Now i create the veth pair and set mac address in lxc if the network type is ethernet
Signed-off-by: mark zhong <zhongguocheng1@163.com> --- src/lxc/lxc_process.c | 36 ++++++++++++++++++++++++++++++++++++ src/lxc/lxc_process.h | 3 +++ 2 files changed, 39 insertions(+)
Not quite my area of expertise, but since it's been sitting a couple of weeks - I figure could take a look and make some non-expert comments... First a bit of investigation shows the following patch and response: http://www.redhat.com/archives/libvir-list/2012-September/msg01588.html http://www.redhat.com/archives/libvir-list/2012-September/msg01840.html Second I was curious why "ETHERNET" was left in the switch in virLXCProcessSetupInterfaces with just the break... I see commit id '22cff52a2' seems to have added that (although it looks strange in the git diff). Whether the XML provided in that commit message actually worked - I'm not clear. Whether it's supposed to have actually been added - I'm starting to doubt. Third the added function was static to lxc_process.c so not technically necessary to add the prototype in lxc_process.h; however, I do note that the other cases in the switch can be called from lxc_driver for hotplug capability... Finally, when running this patch through make syntax-check it fails due to TABS being used for that switch case statement. John
diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c index 57e3880..913fe36 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -359,6 +359,39 @@ char *virLXCProcessSetupInterfaceDirect(virConnectPtr conn, return ret; }
+char *virLXCProcessSetupInterfaceEthernet(virDomainDefPtr vm, + virDomainNetDefPtr net) +{ + char *ret = NULL; + char *parentVeth; + char *containerVeth = NULL; + + VIR_DEBUG("calling vethCreate()"); + parentVeth = net->ifname; + if (virNetDevVethCreate(&parentVeth, &containerVeth) < 0) + goto cleanup; + VIR_DEBUG("parentVeth: %s, containerVeth: %s", parentVeth, containerVeth); + + if (net->ifname == NULL) + net->ifname = parentVeth; + + if (virNetDevSetMAC(containerVeth, &net->mac) < 0) + goto cleanup; + + if (virNetDevSetOnline(parentVeth, true) < 0) + goto cleanup; + + if (net->filter && + virDomainConfNWFilterInstantiate(vm->uuid, net) < 0) + goto cleanup; + + ret = containerVeth; + + cleanup: + return ret; +} + + static const char *nsInfoLocal[VIR_LXC_DOMAIN_NAMESPACE_LAST] = { [VIR_LXC_DOMAIN_NAMESPACE_SHARENET] = "net", [VIR_LXC_DOMAIN_NAMESPACE_SHAREIPC] = "ipc", @@ -559,6 +592,9 @@ static int virLXCProcessSetupInterfaces(virConnectPtr conn, break;
case VIR_DOMAIN_NET_TYPE_ETHERNET: + if (!(veth = virLXCProcessSetupInterfaceEthernet(def, + net))) + goto cleanup; break;
case VIR_DOMAIN_NET_TYPE_USER: diff --git a/src/lxc/lxc_process.h b/src/lxc/lxc_process.h index b6c8083..3b4ade3 100644 --- a/src/lxc/lxc_process.h +++ b/src/lxc/lxc_process.h @@ -53,5 +53,8 @@ char *virLXCProcessSetupInterfaceBridged(virDomainDefPtr vm, char *virLXCProcessSetupInterfaceDirect(virConnectPtr conn, virDomainDefPtr def, virDomainNetDefPtr net); +char *virLXCProcessSetupInterfaceEthernet(virDomainDefPtr vm, + virDomainNetDefPtr net); +
#endif /* __LXC_PROCESS_H__ */
participants (2)
-
John Ferlan
-
mark zhong