|
|
|
@ -110,9 +110,11 @@ do { \ |
|
|
|
|
* overload it to mean fasync when stored there. |
|
|
|
|
*/ |
|
|
|
|
#define TUN_FASYNC IFF_ATTACH_QUEUE |
|
|
|
|
/* High bits in flags field are unused. */ |
|
|
|
|
#define TUN_VNET_LE 0x80000000 |
|
|
|
|
|
|
|
|
|
#define TUN_FEATURES (IFF_NO_PI | IFF_ONE_QUEUE | IFF_VNET_HDR | \ |
|
|
|
|
IFF_VNET_LE | IFF_MULTI_QUEUE) |
|
|
|
|
IFF_MULTI_QUEUE) |
|
|
|
|
#define GOODCOPY_LEN 128 |
|
|
|
|
|
|
|
|
|
#define FLT_EXACT_COUNT 8 |
|
|
|
@ -208,12 +210,12 @@ struct tun_struct { |
|
|
|
|
|
|
|
|
|
static inline u16 tun16_to_cpu(struct tun_struct *tun, __virtio16 val) |
|
|
|
|
{ |
|
|
|
|
return __virtio16_to_cpu(tun->flags & IFF_VNET_LE, val); |
|
|
|
|
return __virtio16_to_cpu(tun->flags & TUN_VNET_LE, val); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static inline __virtio16 cpu_to_tun16(struct tun_struct *tun, u16 val) |
|
|
|
|
{ |
|
|
|
|
return __cpu_to_virtio16(tun->flags & IFF_VNET_LE, val); |
|
|
|
|
return __cpu_to_virtio16(tun->flags & TUN_VNET_LE, val); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static inline u32 tun_hashfn(u32 rxhash) |
|
|
|
@ -1843,6 +1845,7 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd, |
|
|
|
|
int sndbuf; |
|
|
|
|
int vnet_hdr_sz; |
|
|
|
|
unsigned int ifindex; |
|
|
|
|
int le; |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
if (cmd == TUNSETIFF || cmd == TUNSETQUEUE || _IOC_TYPE(cmd) == 0x89) { |
|
|
|
@ -2042,6 +2045,23 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd, |
|
|
|
|
tun->vnet_hdr_sz = vnet_hdr_sz; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case TUNGETVNETLE: |
|
|
|
|
le = !!(tun->flags & TUN_VNET_LE); |
|
|
|
|
if (put_user(le, (int __user *)argp)) |
|
|
|
|
ret = -EFAULT; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case TUNSETVNETLE: |
|
|
|
|
if (get_user(le, (int __user *)argp)) { |
|
|
|
|
ret = -EFAULT; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if (le) |
|
|
|
|
tun->flags |= TUN_VNET_LE; |
|
|
|
|
else |
|
|
|
|
tun->flags &= ~TUN_VNET_LE; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case TUNATTACHFILTER: |
|
|
|
|
/* Can be set only for TAPs */ |
|
|
|
|
ret = -EINVAL; |
|
|
|
|