[libvirt] [PATH lxc_support_ethernet] fix bug:lxc don't support network type of ethernet
John Ferlan
jferlan at redhat.com
Thu Dec 17 19:35:31 UTC 2015
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 at 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__ */
>
More information about the libvir-list
mailing list