[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [net-next RFC V2 PATCH 5/5] tuntap: add ioctls to attach or
From: |
Jason Wang |
Subject: |
[Qemu-devel] [net-next RFC V2 PATCH 5/5] tuntap: add ioctls to attach or detach a file form tap device |
Date: |
Sat, 17 Sep 2011 14:03:00 +0800 |
User-agent: |
StGit/0.15 |
New ioctls were added to let multiple files/sockets to be attached to
a tap device.
Signed-off-by: Jason Wang <address@hidden>
---
drivers/net/tun.c | 25 ++++++++++++++++++++++---
include/linux/if_tun.h | 3 +++
2 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index ec29f85..6a1b591 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -1343,11 +1343,12 @@ static long __tun_chr_ioctl(struct file *file, unsigned
int cmd,
{
struct tun_file *tfile = file->private_data;
struct tun_struct *tun;
+ struct net_device *dev = NULL;
void __user* argp = (void __user*)arg;
struct ifreq ifr;
int ret;
- if (cmd == TUNSETIFF || _IOC_TYPE(cmd) == 0x89)
+ if (cmd == TUNSETIFF || cmd == TUNATTACHQUEUE || _IOC_TYPE(cmd) == 0x89)
if (copy_from_user(&ifr, argp, ifreq_len))
return -EFAULT;
@@ -1356,7 +1357,7 @@ static long __tun_chr_ioctl(struct file *file, unsigned
int cmd,
* This is needed because we never checked for invalid flags on
* TUNSETIFF. */
return put_user(IFF_TUN | IFF_TAP | IFF_NO_PI | IFF_ONE_QUEUE |
- IFF_VNET_HDR,
+ IFF_VNET_HDR | IFF_MULTI_QUEUE,
(unsigned int __user*)argp);
}
@@ -1372,6 +1373,9 @@ static long __tun_chr_ioctl(struct file *file, unsigned
int cmd,
return -EFAULT;
return ret;
}
+ if (cmd == TUNDETACHQUEUE) {
+ return tun_detach(tfile, false);
+ }
rtnl_lock();
@@ -1379,7 +1383,7 @@ static long __tun_chr_ioctl(struct file *file, unsigned
int cmd,
ret = -EBADFD;
tun = rcu_dereference(tfile->tun);
- if (!tun)
+ if (!tun && cmd != TUNATTACHQUEUE)
goto unlock;
@@ -1394,6 +1398,21 @@ static long __tun_chr_ioctl(struct file *file, unsigned
int cmd,
ret = -EFAULT;
goto out;
+ case TUNATTACHQUEUE:
+ dev = __dev_get_by_name(tfile->net, ifr.ifr_name);
+ if (!dev || dev->netdev_ops != &tap_netdev_ops) {
+ ret = -EINVAL;
+ } else if (ifr.ifr_flags &
+ ~(IFF_TAP | IFF_NO_PI | IFF_VNET_HDR)) {
+ /* ignore illegal flag */
+ ret = -EINVAL;
+ } else {
+ tfile->flags = TUN_TAP_DEV | TUN_NO_PI | TUN_VNET_HDR;
+ tun = netdev_priv(dev);
+ ret = tun_attach(tun, file);
+ }
+ break;
+
case TUNSETNOCSUM:
/* Disable/Enable checksum */
diff --git a/include/linux/if_tun.h b/include/linux/if_tun.h
index c92a291..d3f24d8 100644
--- a/include/linux/if_tun.h
+++ b/include/linux/if_tun.h
@@ -54,6 +54,9 @@
#define TUNDETACHFILTER _IOW('T', 214, struct sock_fprog)
#define TUNGETVNETHDRSZ _IOR('T', 215, int)
#define TUNSETVNETHDRSZ _IOW('T', 216, int)
+#define TUNATTACHQUEUE _IOW('T', 217, int)
+#define TUNDETACHQUEUE _IOW('T', 218, int)
+
/* TUNSETIFF ifr flags */
#define IFF_TUN 0x0001
- [Qemu-devel] [net-next RFC V2 PATCH 0/5] Multiqueue support in tun/tap, Jason Wang, 2011/09/17
- [Qemu-devel] [net-next RFC V2 PATCH 1/5] tuntap: move socket to tun_file, Jason Wang, 2011/09/17
- [Qemu-devel] [net-next RFC V2 PATCH 2/5] tuntap: categorize ioctl, Jason Wang, 2011/09/17
- [Qemu-devel] [net-next RFC V2 PATCH 3/5] tuntap: introduce multiqueue flags, Jason Wang, 2011/09/17
- [Qemu-devel] [net-next RFC V2 PATCH 4/5] tuntap: multiqueue support, Jason Wang, 2011/09/17
- [Qemu-devel] [net-next RFC V2 PATCH 5/5] tuntap: add ioctls to attach or detach a file form tap device,
Jason Wang <=
- Re: [Qemu-devel] [net-next RFC V2 PATCH 0/5] Multiqueue support in tun/tap, Michael S. Tsirkin, 2011/09/17
- Re: [Qemu-devel] [net-next RFC V2 PATCH 0/5] Multiqueue support in tun/tap, Ben Hutchings, 2011/09/19