From 99f11bdfe0274ff094a62b5cfcd27c30fce5de42 Mon Sep 17 00:00:00 2001 From: Mark McLoughlin Date: Fri, 15 Aug 2008 15:09:56 -0700 Subject: [PATCH] --- yaml --- r: 108807 b: refs/heads/master c: e3b99556975907530aeb9745e7b3945a0da48f17 h: refs/heads/master i: 108805: 429548fc56fa23305e532cfafa3b1c5cf873fac8 108803: 196660869e751de869c0aa2b5ceba406c65e519a 108799: b3dd26fe354d7a61876f38cd6b7b4ba9a0a38a0c v: v3 --- [refs] | 2 +- trunk/drivers/net/tun.c | 39 ++++++++++++++++++++++++++++++++++++ trunk/include/linux/if_tun.h | 1 + 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 6094b37c7203..6b2a9b22bd8c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 04a0551c87363f100b04d28d7a15a632b70e18e7 +refs/heads/master: e3b99556975907530aeb9745e7b3945a0da48f17 diff --git a/trunk/drivers/net/tun.c b/trunk/drivers/net/tun.c index e6bbc639c2d0..95931a5a9883 100644 --- a/trunk/drivers/net/tun.c +++ b/trunk/drivers/net/tun.c @@ -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) diff --git a/trunk/include/linux/if_tun.h b/trunk/include/linux/if_tun.h index 4c6307ad9fdb..8529f57ba263 100644 --- a/trunk/include/linux/if_tun.h +++ b/trunk/include/linux/if_tun.h @@ -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