Quoting Dongsheng Yang (yangds.f...@cn.fujitsu.com):
> Currently, we depends on ip command to attach interface to container.
> It means we only implemented it by python.
> 
> This patch implement adding and removing interface by c and added
> them in struct container.
> 
> Signed-off-by: Dongsheng Yang <yangds.f...@cn.fujitsu.com>

Overall looks ok, but please see below.

Please don't resend the whole patchset, only send updated patches in
reply in this thread.

> ---
>  src/lxc/lxccontainer.c | 78 
> ++++++++++++++++++++++++++++++++++++++++++++++++++
>  src/lxc/lxccontainer.h | 19 ++++++++++++
>  2 files changed, 97 insertions(+)
> 
> diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
> index f210a88..fedcf97 100644
> --- a/src/lxc/lxccontainer.c
> +++ b/src/lxc/lxccontainer.c
> @@ -39,6 +39,7 @@
>  
>  #include <lxc/lxccontainer.h>
>  #include <lxc/version.h>
> +#include <lxc/network.h>
>  
>  #include "config.h"
>  #include "lxc.h"
> @@ -3455,6 +3456,81 @@ static bool lxcapi_remove_device_node(struct 
> lxc_container *c, const char *src_p
>       return add_remove_device_node(c, src_path, dest_path, false);
>  }
>  
> +static bool lxcapi_attach_interface(struct lxc_container *c, const char 
> *ifname,
> +                             const char *dst_ifname)
> +{
> +     int ret = 0;
> +
> +     ret = lxc_netdev_isup(ifname);
> +     if (ret < 0)
> +             goto err;

This'll need tweaking based on your update to the lxc_netdev_isup patch.

I guess since you care about EINVAl it should return an int after
all.

> +
> +     /* netdev of ifname is up. */
> +     if (ret) {
> +             ret = lxc_netdev_down(ifname);
> +             if (ret)
> +                     goto err;
> +     }
> +
> +     ret = lxc_netdev_move_by_name(ifname, c->init_pid(c), dst_ifname);
> +     if (ret)
> +             goto err;
> +
> +     return true;
> +err:
> +     /* -EINVAL means there is no netdev named as ifanme. */
> +     if (ret == -EINVAL) {
> +             ERROR("No network device named as %s.", ifname);
> +     }
> +     return false;
> +}
> +
> +static bool lxcapi_detach_interface(struct lxc_container *c, const char 
> *ifname,
> +                                     const char *dst_ifname)
> +{
> +     pid_t pid, pid_outside;

Might want to check here whether the caller is root, and give a
clearer error msg.

> +     pid_outside = getpid();
> +
> +     pid = fork();
> +     if (pid < 0) {
> +             ERROR("failed to fork task to get interfaces information");
> +             return false;
> +     }
> +
> +     if (pid == 0) { // child
> +             int ret = 0;
> +             if (!enter_to_ns(c)) {
> +                     ERROR("failed to enter namespace");
> +                     exit(-1);
> +             }
> +
> +             ret = lxc_netdev_isup(ifname);
> +             if (ret < 0)
> +                     exit(ret);
> +
> +             /* netdev of ifname is up. */
> +             if (ret) {
> +                     ret = lxc_netdev_down(ifname);
> +                     if (ret)
> +                             exit(ret);
> +             }
> +
> +             ret = lxc_netdev_move_by_name(ifname, pid_outside, dst_ifname);
> +
> +             /* -EINVAL means there is no netdev named as ifanme. */
> +             if (ret == -EINVAL) {
> +                     ERROR("No network device named as %s.", ifname);
> +             }
> +             exit(ret);
> +     }
> +
> +     if (wait_for_pid(pid) != 0)
> +             return false;
> +
> +     return true;
> +}
> +
>  struct criu_opts {
>       /* The type of criu invocation, one of "dump" or "restore" */
>       char *action;
> @@ -4050,6 +4126,8 @@ struct lxc_container *lxc_container_new(const char 
> *name, const char *configpath
>       c->may_control = lxcapi_may_control;
>       c->add_device_node = lxcapi_add_device_node;
>       c->remove_device_node = lxcapi_remove_device_node;
> +     c->attach_interface = lxcapi_attach_interface;
> +     c->detach_interface = lxcapi_detach_interface;
>       c->checkpoint = lxcapi_checkpoint;
>       c->restore = lxcapi_restore;
>  
> diff --git a/src/lxc/lxccontainer.h b/src/lxc/lxccontainer.h
> index 6344f3d..f9feeba 100644
> --- a/src/lxc/lxccontainer.h
> +++ b/src/lxc/lxccontainer.h
> @@ -762,6 +762,25 @@ struct lxc_container {
>       bool (*remove_device_node)(struct lxc_container *c, const char 
> *src_path, const char *dest_path);
>  
>       /*!
> +      * \brief Add specified netdev to the container.
> +      *
> +      * \param c Container.
> +      * \param dev name of net device.
> +      *
> +      * \return \c true on success, else \c false.
> +      */
> +     bool (*attach_interface)(struct lxc_container *c, const char *dev, 
> const char *dst_dev);
> +
> +     /*!
> +      * \brief Remove specified netdev from the container.
> +      *
> +      * \param c Container.
> +      * \param dev name of net device.
> +      *
> +      * \return \c true on success, else \c false.
> +      */
> +     bool (*detach_interface)(struct lxc_container *c, const char *dev, 
> const char *dst_dev);
> +     /*!
>        * \brief Checkpoint a container.
>        *
>        * \param c Container.
> -- 
> 1.8.4.2
> 
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to