[Devel] [PATCH] tun: Add ioctl() TUNGETDEVNETNS cmd to allow obtaining real net ns of tun device
Kirill Tkhai
ktkhai at virtuozzo.com
Wed Nov 6 14:09:16 MSK 2019
On 06.11.2019 13:57, Alexander Mikhalitsyn wrote:
> In commit f2780d6d7475 "tun: Add ioctl() SIOCGSKNS cmd to allow
> obtaining net ns of tun device" it was missed that tun may change
> its net ns, while net ns of socket remains the same as it was
> created initially. SIOCGSKNS returns net ns of socket, so it is
> not suitable for obtaining net ns of device.
>
> We may have two tun devices with the same names in two net ns,
> and in this case it's not possible to determ, which of them
> fd refers to (TUNGETIFF will return the same name).
>
> This patch adds new ioctl() cmd for obtaining net ns of a device.
>
> Reported-by: Harald Albrecht <harald.albrecht at gmx.net>
> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
> Signed-off-by: David S. Miller <davem at davemloft.net>
>
> https://jira.sw.ru/browse/PSBM-99027
> (ported from commit 0c3e0e3bb623c3735b8c9ab8aa8332f944f83a9f)
> Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn at virtuozzo.com>
Acked-by: Kirill Tkhai <ktkhai at virtuozzo.com>
> ---
> drivers/net/tun.c | 10 ++++++++++
> include/uapi/linux/if_tun.h | 1 +
> 2 files changed, 11 insertions(+)
>
> diff --git a/drivers/net/tun.c b/drivers/net/tun.c
> index e65ded4..d4c3866 100644
> --- a/drivers/net/tun.c
> +++ b/drivers/net/tun.c
> @@ -2326,6 +2326,7 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
> void __user* argp = (void __user*)arg;
> unsigned int ifindex, carrier;
> struct ifreq ifr;
> + struct net *net;
> kuid_t owner;
> kgid_t group;
> int sndbuf;
> @@ -2402,6 +2403,7 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
>
> tun_debug(KERN_INFO, tun, "tun_chr_ioctl cmd %u\n", cmd);
>
> + net = dev_net(tun->dev);
> ret = 0;
> switch (cmd) {
> case TUNGETIFF:
> @@ -2615,6 +2617,14 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
> ret = tun_net_change_carrier(tun->dev, (bool)carrier);
> break;
>
> + case TUNGETDEVNETNS:
> + ret = -EPERM;
> + if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
> + goto unlock;
> +
> + ret = open_net_ns_fd(net);
> + break;
> +
> default:
> ret = -EINVAL;
> break;
> diff --git a/include/uapi/linux/if_tun.h b/include/uapi/linux/if_tun.h
> index af37baf..b248123 100644
> --- a/include/uapi/linux/if_tun.h
> +++ b/include/uapi/linux/if_tun.h
> @@ -57,6 +57,7 @@
> #define TUNSETVNETBE _IOW('T', 222, int)
> #define TUNGETVNETBE _IOR('T', 223, int)
> #define TUNSETCARRIER _IOW('T', 226, int)
> +#define TUNGETDEVNETNS _IO('T', 227)
>
> /* CONFIG_VE_TUNTAP_ACCOUNTING should be set */
> #define TUNSETACCTID _IOW('T', 300, struct ifreq)
>
More information about the Devel
mailing list