[lxc-devel] [PATCH] find veth name for unprivileged containers
Serge Hallyn
serge.hallyn at ubuntu.com
Fri Feb 14 15:21:45 UTC 2014
Quoting S.Çağlar Onur (caglar at 10ur.org):
> 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 <caglar at 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) {
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
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel
More information about the lxc-devel
mailing list