[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