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 <cag...@10ur.org>
---
 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) {
+                       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
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to