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
