mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
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: Mark McLoughlin <markmc@redhat.com> Acked-by: Max Krasnyansky <maxk@qualcomm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
04a0551c87
commit
e3b9955697
2 changed files with 40 additions and 0 deletions
|
@ -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,
|
||||||
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 @@
|
||||||
#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
|
||||||
|
|
Loading…
Reference in a new issue