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