Quoting S.Çağlar Onur ([email protected]):
> unprivileged containers uses lxc-user-nic to create the underlying
> network. And because of that reason netdev struct misses some
> information (like the name of the interface seen from the host side)
> 
> Find that information by parsing /proc/self/net/dev and return to
> caller.
> 
> With this patch lxc-info starts to show network stats for unpriv.
> containers.
> 
> lxc-info -n rubik
> Name:           rubik
> State:          RUNNING
> PID:            6054
> IP:             10.0.3.119
> CPU use:        0.97 seconds
> BlkIO use:      0 bytes
> Memory use:     6.52 MiB
> KMem use:       0 bytes
> Link:           veth5YTBDK
>  TX bytes:      3.41 KiB
>   RX bytes:      8.54 KiB
>    Total bytes:   11.95 KiB
> 
> Signed-off-by: S.Çağlar Onur <[email protected]>
> ---
>  src/lxc/confile.c | 16 +++++++++++-----
>  src/lxc/utils.c   | 25 +++++++++++++++++++++++++
>  src/lxc/utils.h   |  2 ++
>  3 files changed, 38 insertions(+), 5 deletions(-)
> 
> diff --git a/src/lxc/confile.c b/src/lxc/confile.c
> index fa263ef..5794220 100644
> --- a/src/lxc/confile.c
> +++ b/src/lxc/confile.c
> @@ -931,7 +931,7 @@ static int config_hook(const char *key, const char *value,
>                                struct lxc_conf *lxc_conf)
>  {
>       char *copy;
> -     
> +
>       if (!value || strlen(value) == 0)
>               return lxc_clear_hooks(lxc_conf, key);
>  
> @@ -2002,10 +2002,16 @@ static int lxc_get_item_nic(struct lxc_conf *c, char 
> *retv, int inlen,
>               }
>       } else if (strcmp(p1, "veth.pair") == 0) {
>               if (netdev->type == LXC_NET_VETH) {
> -                     strprint(retv, inlen, "%s",
> -                              netdev->priv.veth_attr.pair ?
> -                               netdev->priv.veth_attr.pair :
> -                               netdev->priv.veth_attr.veth1);
> +                     if (am_unpriv()) {
> +                             char *veth = find_veth_name();
> +                             strprint(retv, inlen, "%s", veth);
> +                             if (veth)
> +                                     free(veth);
> +                     } else {
> +                             strprint(retv, inlen, "%s", 
> netdev->priv.veth_attr.pair ?
> +                                     netdev->priv.veth_attr.pair :
> +                                     netdev->priv.veth_attr.veth1);
> +                     }
>               }
>       } else if (strcmp(p1, "vlan") == 0) {
>               if (netdev->type == LXC_NET_VLAN) {
> diff --git a/src/lxc/utils.c b/src/lxc/utils.c
> index 3dff104..d82c704 100644
> --- a/src/lxc/utils.c
> +++ b/src/lxc/utils.c
> @@ -1175,3 +1175,28 @@ uint64_t fnv_64a_buf(void *buf, size_t len, uint64_t 
> hval)
>  
>       return hval;
>  }
> +
> +char* find_veth_name(void)
> +{
> +     int len;
> +     FILE *fp;
> +     char buf[255], *substr = NULL, *semicolon, *str;
> +
> +     fp = fopen("/proc/self/net/dev", "r");
> +     if (!fp)
> +             return NULL;
> +
> +     while (fgets(buf, 255, fp)) {
> +             if ((str = strstr(buf, "veth")) != NULL) {

This appears to be broken right now, but one day the user should be
able to start two devices, eth0 and eth1...  So I think the whole
netdev->name should be compared.  Do you agree?

Another approach (a bit more coding work but perhaps more correct) would
be for lxc-user-nic to pass the device and pair names back to lxc.
Presumably over stdout.

> +                     semicolon = strchr(str, ':');
> +                     len = semicolon ? (semicolon - str) : strlen(str);
> +
> +                     substr = malloc(len+1);
> +                     memcpy(substr, str, len);
> +                     substr[len] = '\0';
> +             }
> +     }
> +     fclose(fp);
> +
> +    return substr;
> +}
> diff --git a/src/lxc/utils.h b/src/lxc/utils.h
> index f541253..08cc41c 100644
> --- a/src/lxc/utils.h
> +++ b/src/lxc/utils.h
> @@ -275,4 +275,6 @@ extern bool dir_exists(const char *path);
>  
>  #define FNV1A_64_INIT ((uint64_t)0xcbf29ce484222325ULL)
>  uint64_t fnv_64a_buf(void *buf, size_t len, uint64_t hval);
> +
> +extern char* find_veth_name(void);
>  #endif
> -- 
> 1.8.3.2
> 
> _______________________________________________
> lxc-devel mailing list
> [email protected]
> http://lists.linuxcontainers.org/listinfo/lxc-devel
_______________________________________________
lxc-devel mailing list
[email protected]
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to