Skip to contentSkip to conversation

tun: TUNGETIFF interface to query name and flags

PATCH Applied Mark McLoughlin 5 participants 6 messages Aug 13, 2008 – Aug 15, 2008

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

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
index e6bbc63..95931a5 100644
@@ -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
index 4c6307a..8529f57 100644
@@ -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
#1 lore raw
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.

#2 lore raw
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.

#3 lore raw
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

#4 lore raw
In reply to Rusty Russell

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

maintainer Applied
#5 lore raw

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.