Commit e3b99556 authored by Mark McLoughlin's avatar Mark McLoughlin Committed by David S. Miller

tun: TUNGETIFF interface to query name and flags

Add a TUNGETIFF interface so that userspace can query a
tun/tap descriptor for its name and flags.

This is needed because it is common for one app to create
a tap interface, exec another app and pass it the file
descriptor for the interface. Without TUNGETIFF the spawned
app has no way of detecting wheter the interface has e.g.
IFF_VNET_HDR set.
Signed-off-by: default avatarMark McLoughlin <markmc@redhat.com>
Acked-by: default avatarMax Krasnyansky <maxk@qualcomm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 04a0551c
...@@ -748,6 +748,36 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr) ...@@ -748,6 +748,36 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
return err; return err;
} }
static int tun_get_iff(struct net *net, struct file *file, struct ifreq *ifr)
{
struct tun_struct *tun = file->private_data;
if (!tun)
return -EBADFD;
DBG(KERN_INFO "%s: tun_get_iff\n", tun->dev->name);
strcpy(ifr->ifr_name, tun->dev->name);
ifr->ifr_flags = 0;
if (ifr->ifr_flags & TUN_TUN_DEV)
ifr->ifr_flags |= IFF_TUN;
else
ifr->ifr_flags |= IFF_TAP;
if (tun->flags & TUN_NO_PI)
ifr->ifr_flags |= IFF_NO_PI;
if (tun->flags & TUN_ONE_QUEUE)
ifr->ifr_flags |= IFF_ONE_QUEUE;
if (tun->flags & TUN_VNET_HDR)
ifr->ifr_flags |= IFF_VNET_HDR;
return 0;
}
/* This is like a cut-down ethtool ops, except done via tun fd so no /* This is like a cut-down ethtool ops, except done via tun fd so no
* privs required. */ * privs required. */
static int set_offload(struct net_device *dev, unsigned long arg) static int set_offload(struct net_device *dev, unsigned long arg)
...@@ -833,6 +863,15 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file, ...@@ -833,6 +863,15 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file,
DBG(KERN_INFO "%s: tun_chr_ioctl cmd %d\n", tun->dev->name, cmd); DBG(KERN_INFO "%s: tun_chr_ioctl cmd %d\n", tun->dev->name, cmd);
switch (cmd) { switch (cmd) {
case TUNGETIFF:
ret = tun_get_iff(current->nsproxy->net_ns, file, &ifr);
if (ret)
return ret;
if (copy_to_user(argp, &ifr, sizeof(ifr)))
return -EFAULT;
break;
case TUNSETNOCSUM: case TUNSETNOCSUM:
/* Disable/Enable checksum */ /* Disable/Enable checksum */
if (arg) if (arg)
......
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
#define TUNGETFEATURES _IOR('T', 207, unsigned int) #define TUNGETFEATURES _IOR('T', 207, unsigned int)
#define TUNSETOFFLOAD _IOW('T', 208, unsigned int) #define TUNSETOFFLOAD _IOW('T', 208, unsigned int)
#define TUNSETTXFILTER _IOW('T', 209, unsigned int) #define TUNSETTXFILTER _IOW('T', 209, unsigned int)
#define TUNGETIFF _IOR('T', 210, unsigned int)
/* TUNSETIFF ifr flags */ /* TUNSETIFF ifr flags */
#define IFF_TUN 0x0001 #define IFF_TUN 0x0001
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment