tun: TUNGETIFF interface to query name and flags
Subsystems (4)
PATCH 1/1 tun: TUNGETIFF interface to query name and flags
Rusty/Max,
While adding support to KVM for IFF_VNET_HDR it became apparent that we need some way of querying a file descriptor for whether IFF_VNET_HDR has been set.
Basically, some apps like libvirt open the tap fd, connect the interface to the appropriate bridge and pass the fd to kvm via the command line.
So, those apps need to set IFF_VNET_HDR and KVM needs to be able to detect that and handle it correctly.
A very simple approach is attached; I did consider doing a TUNGETFLAGS that would return tun->flags, but I think it's nicer to have a companion to TUNGETIFF since it also allows one to query the interface name from the file descriptor.
Cheers,
Mark.
Subject: [PATCH 1/1] 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.
--- drivers/net/tun.c | 39 +++++++++++++++++++++++++++++++++++++++ include/linux/if_tun.h | 1 + 2 files changed, 40 insertions(+), 0 deletions(-)
drivers/net/tun.c +39 -0
@@ -748,6 +748,36 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)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 * privs required. */ 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);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 :/* Disable/Enable checksum */ if (arg)
include/linux/if_tun.h +1 -0
@@ -45,6 +45,7 @@#define TUNGETFEATURES _IOR('T', 207, unsigned int)#define TUNSETOFFLOAD _IOW('T', 208, unsigned int)#define TUNSETTXFILTER _IOW('T', 209, unsigned int) +#define TUNGETIFF _IOR('T', 210, unsigned int)/* TUNSETIFF ifr flags */ #define IFF_TUN 0x0001
Signature · 1 line
1.5.4.1
Quoted 4 lines · On Thursday 14 August 2008 00:30:16 Mark McLoughlin wrote:
A very simple approach is attached; I did consider doing a TUNGETFLAGS that would return
tun->flags, but I think it's nicer to have a companion to TUNGETIFF since it also allows one to query the interface name from the file descriptor.
This seems really sensible to me.
If Max acks it, I'd say Dave should merge it.
Rusty.
Quoted 9 lines · Rusty Russell
Quoted 4 lines · On Thursday 14 August 2008 00:30:16 Mark McLoughlin wrote:
A very simple approach is attached; I did consider doing a TUNGETFLAGS that would return
tun->flags, but I think it's nicer to have a companion to TUNGETIFF since it also allows one to query the interface name from the file descriptor.This seems really sensible to me.
If Max acks it,
How about it Max?
Trying a different email address - previous mail at:
http://marc.info/?l=linux-netdev&m=121863813904363
Quoted 1 line
I'd say Dave should merge it.
Maybe it's too late already, but I'm really hoping to get this in 2.6.27.
Without it, the IFF_VNET_HDR goodness already added in 2.6.27 can't be used by KVM guests created by libvirt ... which is a good chunk of the potential users for this stuff.
Cheers,
Mark.
Quoted 11 lines · Mark McLoughlin
Quoted 8 lines · Rusty Russell
Quoted 4 lines · On Thursday 14 August 2008 00:30:16 Mark McLoughlin wrote:
A very simple approach is attached; I did consider doing a TUNGETFLAGS that would return
tun->flags, but I think it's nicer to have a companion to TUNGETIFF since it also allows one to query the interface name from the file descriptor.This seems really sensible to me.
If Max acks it,
How about it Max?
Sorry for the delay Mark. I replied to your other email. ACK.
Max
Sorry for the delay guys. Was trying to get QEMU USB changes out and was not paying attention to the other stuff :)
Quoted 9 lines · Rusty Russell
Quoted 4 lines · On Thursday 14 August 2008 00:30:16 Mark McLoughlin wrote:
A very simple approach is attached; I did consider doing a TUNGETFLAGS that would return
tun->flags, but I think it's nicer to have a companion to TUNGETIFF since it also allows one to query the interface name from the file descriptor.This seems really sensible to me.
If Max acks it, I'd say Dave should merge it.
Makes perfect sense to me.
Definitely Ack. It has zero impact on existing user and I'd be ok if this goes
in during .27-rc series.
Max
From: Max Krasnyansky <[email protected]>
Date: Fri, 15 Aug 2008 11:00:19 -0700
Quoted 7 lines
Quoted 6 lines · Rusty Russell
Quoted 4 lines · On Thursday 14 August 2008 00:30:16 Mark McLoughlin wrote:
A very simple approach is attached; I did consider doing a TUNGETFLAGS that would return
tun->flags, but I think it's nicer to have a companion to TUNGETIFF since it also allows one to query the interface name from the file descriptor.
Quoted 7 lines
Quoted 3 lines
This seems really sensible to me.
If Max acks it, I'd say Dave should merge it.
Makes perfect sense to me.
Definitely Ack. It has zero impact on existing user and I'd be ok if this goes
in during .27-rc series.
I've applied Mark's patch, thanks.